在Unix中按列值拆分文本文件并生成顺序命名的输出文件
按第一列分组并输出到顺序命名文件的Unix解决方案
要实现将制表符分隔文件按第一列分组,输出到tmp1.txt、tmp2.txt这类顺序命名的文件中,可以使用以下awk命令:
awk '!seen[$1]++ {file_num++} {print $0 >> ("tmp" file_num ".txt"); close("tmp" file_num ".txt")}' input.txt
命令解释
!seen[$1]++:通过关联数组seen记录第一列值的出现次数。当首次遇到某个值时,执行file_num++,为该值分配唯一的文件序号;后续再遇到相同值时,不会触发序号递增。print $0 >> ("tmp" file_num ".txt"):将当前行追加到对应序号的输出文件中。close("tmp" file_num ".txt"):每次写入后关闭文件,避免因打开过多文件句柄导致报错,尤其适合处理大文件。
效果验证
以你提供的输入文件为例:
A 2 A 4 B 4 B 6 A 1 C 5
执行命令后会生成三个文件:
tmp1.txt内容:A 2 A 4 A 1tmp2.txt内容:B 4 B 6tmp3.txt内容:C 5
自定义调整
如果需要修改文件名前缀或起始序号,只需调整命令中的对应部分:
- 使用
output作为前缀:awk '!seen[$1]++ {file_num++} {print $0 >> ("output" file_num ".txt"); close("output" file_num ".txt")}' input.txt - 从
tmp0.txt开始编号:awk 'BEGIN {file_num=-1} !seen[$1]++ {file_num++} {print $0 >> ("tmp" file_num ".txt"); close("tmp" file_num ".txt")}' input.txt
内容的提问来源于stack exchange,提问作者fattel
相关产品推荐
相关产品推荐

