Come posso reindirizzare le linee corrispondenti a un file e le linee non corrispondenti a un file diverso?


13

Esiste già uno script / programma / utility per il seguente requisito in modo ottimizzato?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

Risposte:


16

Potresti usare awkper quello.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
Non ho una completa familiarità awkma a che punto valuta >? Se viene valutato ogni volta che si applica il condizionale,
finiresti

1
@Shadur >stampa tutto l'output sul file, sovrascrivendo i file esistenti. Non viene valutato in modo tale da generare nuove righe che sovrascrivono l'output precedente dalla stessa istanza di awk. Cioè, se ci sono più corrispondenze, il file "corrispondenza" conterrà ogni corrispondenza separata da OFS. La differenza tra >ed >>esiste nel trattamento dei file esistenti.
Chris Down,

10

Ecco un sedesempio:
Nota: il wcomando sed sed sovrascriverà un file esistente ogni volta che viene eseguito lo script, ma solo se viene attivato quel particolare comando write; quindi ilrm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

Bello. Senza ramificazione:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

Puoi aggiungere file in awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

o più corto:

awk '{print >>(/pattern/?"matched":"unmatched")}'

Il suo esempio mostra che vuole sovrascrivere i file se esistono, non aggiungere.
Chris Down,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.