特定の列の値に基づいてファイルを分割する

特定の列の値に基づいてファイルを分割する

最初の列に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がさまざまな部分を評価する正しい順序を理解するのに役立ちます。

関連情報