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

Jawaban:


16

Anda bisa menggunakannya awkuntuk itu.

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

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

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")}'

Contohnya menunjukkan bahwa ia ingin menimpa file jika ada, bukan menambahkan.
Chris Down
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.