根据特定列中的值拆分文件

根据特定列中的值拆分文件

我有一个文件,我想将其分解为多个文件,其中第一列具有 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 awk 理解评估各部分的正确顺序。

相关内容