ファイルが多く、入力ファイルを変更せずに特定の行を新しいファイルにエクスポートしたいと思います。たとえば、aで始まるすべての行を新しいファイル(a.txtと呼ばれる)に送信し、他のすべての行を別々のファイルbcd.txtに送信したいとします。
a.......
b.......
c.......
a.......
d.......
現在、grep '^a' infile.txt > a.txt
最初の部分を実行してから入力ファイルをコピーし、それを使用してsed -i 's/^a.*$//g
aで始まる行を削除しています。ソース入力ファイルを複製せずに両方の操作を実行する方法はありますか?
答え1
次に始まるすべての行を取得するにはa
:
grep '^a' infile.txt >a.txt
"a"で始まらないすべての行を取得するには:
grep '^[^a]' infile >bcd.txt # or grep -v '^a' infile.txt >bcd.txt
この表現は[^...]
「この文字セットにないすべての文字」を意味し、文字セットには単一のa
.
コラボレーションの場合は、以下を使用してくださいawk
。
awk '/^a/ { print >"a.txt"; next } { print >"bcd.txt" }' infile.txt
プログラムawk
は、anで始まるすべての行に対して最初のブロックをトリガーa
し、他のすべての行(最初のブロックのステートメントのためにa
lineを除く)に対して2番目のブロックをトリガーします。next
このprint >filename
ステートメントは現在の行を指定のファイルに出力します。
答え2
a
行以外の項目をに送信するには、次のbcd.txt
ことを逆にするだけですgrep
。
grep '^a' infile.txt > a.txt
grep -v '^a' infile.txt > bcd.txt
1つのコマンドのみを使用するもう1つのオプションはawkです。
awk '/^a/ { print > "a.txt" } ! /^a/ { print > "bcd.txt" }' < input
少し並べ替えると次のようになります。
awk '
/^a/ { print > "a.txt" }
! /^a/ { print > "bcd.txt" }'
< input
...で始まる行はa
最初のブロックに入り、 に記録(追加)されa.txt
、次から始まる行はいいえ2番目のブロックを入力して開始し、a
に書き込み(追加)しますbcd.txt
。