2013-11-22 4 views
0

Прежде всего: я на компьютере с Windows 7;).Batch Script для фильтрации строк из текстового файла

У меня есть папка с несколькими десятками файлов. Каждый файл содержит около 240 000 строк. Но нужна только половина этих строк.

Что бы я хотел сделать: есть скрипт, который работает над этими файлами, отфильтровывает каждую строку, содержащую строку «abcd», и сохраняет ее либо в новой директории, либо просто сохраняется в том же файле.

+0

Вы хотите пакетный файл или решение для командной оболочки? – foxidrive

+0

ну, я не против быть честным :) до тех пор, пока он работает :) – user2428207

+0

Вы хотите, чтобы все строки 'abcd' из всех файлов, собранных в один файл, или в отдельные файлы? –

ответ

0
@echo off 
    setlocal enableextensions 

    set "_where=c:\some\where\*.txt" 
    set "_filter=abcd" 

rem find files which needs filter 
for /f "tokens=*" %%f in ('findstr /m "%_filter%" "%_where%"') do (

    rem generate a temporary file with the valid content 
    findstr /v /c:"%_filter%" "%%~ff" > "%%~ff.tmp" 

    rem rename original file to .old 
    ren "%%~ff" *.old > nul 

    rem rename temporary file as original file 
    ren "%%~ff.tmp" "%%~nxf" > nul 

) 
rem if needed, delete *.old files 
1

Я хотел бы попробовать использовать Powershell, как показано ниже:

$currentPath = "the path these files currently in" 
$newPath  = "the path you want to put the new files" 

$files = Get-ChildItem $currentPath 

foreach ($item in $files) { 
    Get-Content $item | Where-Object {$_ -notmatch 'abcd'} |Set-Content $newPath\$item 
} 
0

вы можете использовать sed for Windows

sed -i.bak "/abcd/!d" *.txt 

Найти все abcd, содержащие строки в .txt файлов, сделайте резервную копию файла .bak и хранить обнаруженные строки в исходном файле.

0
@echo on 
For %%a in (*.txt) do (CALL:FILTER "%%a") 
echo/Done.&pause>nul&exit/b 
:FILTER 
type "%~1"|find "abcd" 1>nul 2>nul 
if %errorlevel% EQU 0 find /n "abcd" "%~1">"Found abcd in %~1.txt" 

Команда Найти возвращает уровень ошибки = 0, если ему что-то найти

0

Если файлы, которые большие, я так что-то вроде этого:

$Folder = 'C:\MyOldFiles' 
$NewFolder = 'C:\MyNewFiles' 
New-Item -ItemType Directory -Path $NewFolder -Force 

foreach ($file in Get-ChildItem $Folder) 
{ 
    Get-Content $file -ReadCount 1500 | 
    foreach { $_ -notmatch 'abcd' } | 
    Add-Content "$NewFolder\$($file.name)" 
} 
Смежные вопросы