最初の列にuniq値を持つ複数のファイルに分割したいファイルがあります。たとえば、次はファイルです。
ファイルA.txt
1 Cat
1 Dog
1 Frog
2 Boy
2 Girl
3 Tree
3 Leaf
3 Branch
3 Trunk
私の出力は次のようになりたいです。
ファイル1.txt
1 Cat
2 Boy
3 Tree
ファイル2.txt
1 Dog
2 Girl
3 Leaf
ファイル3.txt
1 Frog
3 Branch
ファイル4.txt
3 Trunk
値が存在しない場合はスキップしたいと思います。私と同じような状況を探しましたが、何も見つかりませんでした。これを行う方法を知っている人はいますか?
編集する:私のawkバージョンは次のとおりです。awk version 20070501
答え1
$ gawk '{print > "file" ++a[$1] ".txt"}' input
# And on OSX awk, and also gawk:
$ awk '{print > ("file" ++a[$1] ".txt")}' input
$ head file*txt
==> file1.txt <==
1 Cat
2 Boy
3 Tree
==> file2.txt <==
1 Dog
2 Girl
3 Leaf
==> file3.txt <==
1 Frog
3 Branch
==> file4.txt <==
3 Trunk
編集する:説明。これにより、現在の行が(>
)に印刷されますfileX.txt
。最初のフィールドが見つかるたびに、配列はa[$1]
評価される前に1ずつ増えます。これはファイル名を設定するために使用されます。
編集2:OSX awkでは確認できませんでしたが、awkの使用について深刻ではない場合は、インストールしても問題ありgawk
ませんmawk
。しかし、次のことを試すことができます。
$ awk '{a[$1]++; f = "file" a[$1] ".txt"; print > f}' input
同じことを行いますが、すべてが別々のステップに分かれています。これは、OSXがさまざまな部分を評価する正しい順序を理解するのに役立ちます。