Jak mogę przekierować pasujące linie do pliku, a niepasujące linie do innego pliku?


13

Czy istnieje już skrypt / program / narzędzie dla następujących wymagań w zoptymalizowany sposób?

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

Odpowiedzi:


16

Możesz awkdo tego użyć .

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

1
Nie jestem do końca zaznajomiony, awkale w którym momencie to ocenia >? Jeśli jest oceniany za każdym razem, gdy warunek ma zastosowanie, skończyłbyś z dwoma plikami
jednowierszowymi

1
@Shadur >drukuje wszystkie dane wyjściowe do pliku, zastępując istniejące pliki. Nie jest analizowany w taki sposób, że spowoduje to, że nowe wiersze zastąpią stare dane wyjściowe z tego samego wystąpienia awk. Oznacza to, że jeśli istnieje wiele dopasowań, plik „dopasuj” będzie zawierał każde dopasowanie oddzielone OFS. Różnica pomiędzy >i >>istnieje w leczeniu istniejących plików.
Chris Down,

10

Oto sedprzykład:
Uwaga: wpolecenie sed zastąpi istniejący plik za każdym razem, gdy skrypt jest uruchamiany, ale tylko wtedy, gdy zostanie uruchomione to konkretne polecenie zapisu; stądrm

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

Ładny. Bez rozgałęzień:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

Możesz dołączyć pliki w awk:

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

lub krócej:

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

Jego przykład pokazuje, że chce zastąpić pliki, jeśli istnieją, a nie dołączać.
Chris Down,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.