一致する行をファイルにリダイレクトし、一致しない行を別のファイルにリダイレクトするにはどうすればよいですか?


13

最適化された方法で、次の要件に対して既に利用可能なスクリプト/プログラム/ユーティリティはありますか?

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

回答:


16

awkそのために使用できます。

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

1
私は完全に慣れてawkいませんが、どの時点で評価され>ますか?それは、条件が適用されるたびに評価されます場合は、2つの1行のファイル...と羽目になるだろう
Shadur

1
@Shadur >は、すべての出力をファイルに出力し、既存のファイルを上書きします。の同じインスタンスからの古い出力を上書きする新しい行をもたらすような方法では評価されませんawk。つまり、複数の一致がある場合、ファイル「一致」には、で区切られた各一致が含まれOFSます。との違いは>>>既存のファイルの処理にあります。
クリスダウン

10

次にsed例を示します。
注:sedのwコマンドは、スクリプトが実行されるたびに既存のファイルを上書きしますが、その特定の書き込みコマンドがトリガーされた場合のみです。従ってrm

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

いいね 分岐なし:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

awkにファイルを追加できます。

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

以下:

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

彼の例では、ファイルを追加するのではなく、存在する場合は上書きすることを示しています。
クリスダウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.