Bagaimana saya bisa mengarahkan ulang baris yang cocok ke file, dan baris yang tidak cocok ke file yang berbeda?

13

Apakah sudah ada skrip / program / utilitas yang tersedia untuk persyaratan berikut secara optimal?

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

Jawaban:

16

Anda bisa menggunakannya awkuntuk itu.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
Chris Down
sumber
1
Saya tidak sepenuhnya akrab dengan awktetapi pada titik apakah itu mengevaluasi >? Jika dievaluasi setiap kali persyaratan berlaku, Anda akan mendapatkan dua file satu-baris ...
Shadur
1
@ Safad >mencetak semua output ke file, menimpa file yang ada. Itu tidak dievaluasi sedemikian rupa sehingga akan menghasilkan setiap baris baru menimpa keluaran lama dari contoh yang sama awk. Artinya, jika ada beberapa kecocokan, file "kecocokan" akan berisi setiap kecocokan yang dipisahkan oleh OFS. Perbedaan antara >dan >>ada dalam perawatan file yang ada.
Chris Down
10

Berikut adalah sedcontohnya:
Catatan: wperintah sed akan menimpa file yang ada setiap kali skrip dijalankan, tetapi hanya jika perintah tulis tertentu dipicu; karenanyarm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
Peter.O
sumber
Bagus. Tanpa bercabang:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti
6

Anda dapat menambahkan file dalam awk:

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

atau lebih pendek:

awk '{print >>(/pattern/?"matched":"unmatched")}'
Michał Šrajer
sumber
Contohnya menunjukkan bahwa ia ingin menimpa file jika ada, bukan menambahkan.
Chris Down