ファイルを分離するには、一度に行を移動します。

ファイルを分離するには、一度に行を移動します。

ファイルが多く、入力ファイルを変更せずに特定の行を新しいファイルにエクスポートしたいと思います。たとえば、aで始まるすべての行を新しいファイル(a.txtと呼ばれる)に送信し、他のすべての行を別々のファイルbcd.txtに送信したいとします。

a.......

b.......

c.......

a.......

d.......

現在、grep '^a' infile.txt > a.txt最初の部分を実行してから入力ファイルをコピーし、それを使用してsed -i 's/^a.*$//gaで始まる行を削除しています。ソース入力ファイルを複製せずに両方の操作を実行する方法はありますか?

答え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し、他のすべての行(最初のブロックのステートメントのためにalineを除く)に対して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

関連情報