多列文件提取前4列唯一行的Awk命令问题排查
问题排查与正确实现
原命令的问题
你的脚本核心错误出在awk的END块里:当遍历数组arr时,打印的$0是最后一行处理过的内容,而非对应arr[i]的目标行。这会导致所有符合arr[i]==1的条目,都重复打印最后一行内容,大数据集里就会出现重复输出的问题。另外,用sed添加分隔符的操作完全多余,awk本身可以直接处理多列。
正确实现(纯awk)
直接用awk提取前4列作为唯一标识,统计出现次数并保存对应行,最后输出仅出现一次的行:
awk -F, '{ key = $1 FS $2 FS $3 FS $4 if (!count[key]) line[key] = $0 # 第一次出现时保存整行 count[key]++ } END { for (k in count) { if (count[k] == 1) print line[k] } }' file.txt
逻辑说明
-F,指定逗号为字段分隔符- 拼接前4列作为唯一
key,用来识别重复行(忽略第5列) - 第一次遇到该
key时,把整行内容存入line[key] count[key]统计该key的出现次数- 最后遍历所有
key,只输出出现次数为1的对应行
另一种实现(sort+uniq组合)
如果习惯用管道命令,也可以用sort先按前4列排序,再用uniq筛选唯一行:
sort -t, -k1,4 file.txt | uniq -u -t, -s "$(echo "20230830,52678,004,Apple" | awk -F, '{print length($1 FS $2 FS $3 FS $4)+1}')"
不过这种方法需要计算前4列的字符长度,不如awk方法直观可靠。
内容的提问来源于stack exchange,提问作者Candy
相关产品推荐
相关产品推荐

