![根据特定列中的值拆分文件](https://linux22.com/image/82634/%E6%A0%B9%E6%8D%AE%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD%E7%9A%84%E5%80%BC%E6%8B%86%E5%88%86%E6%96%87%E4%BB%B6.png)
我有一个文件,我想将其分解为多个文件,其中第一列具有 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 理解评估各部分的正确顺序。