如何用AWK实现按第一列去重并保留每组最后一行?
解决保留第一列相同行组最后一行的问题
你的需求是仅保留第一列内容相同的连续行组中的最后一行,但当前使用的AWK命令逻辑有误,无法得到期望结果。
问题分析
你当前的命令:awk 'BEGIN { FS=OFS=";" } $1==last{next} {last=$1} {print last}' test.txt
存在两个关键问题:
- 逻辑顺序错误:遇到同组行直接跳过,导致无法记录组内的最后一行
- 输出内容错误:打印的是仅第一列的
last值,而非完整的行内容
正确的AWK命令
使用以下命令可以实现需求:awk 'BEGIN{FS=OFS=";"} $1 != last {if (last != "") print prev; last=$1} {prev=$0} END{print prev}' test.txt
逻辑解释
- 初始化分隔符
FS和OFS为分号,保证输出格式与输入一致 - 当当前行第一列与上一组的第一列
last不同时:- 若
last不为空(排除第一行的初始情况),打印上一组保存的最后一行prev - 更新
last为当前行的第一列,切换到新行组
- 若
- 每次循环将当前完整行保存到
prev,确保prev始终是当前组的最后一行 END块打印最后一组的最后一行——因为循环结束时,最后一组的内容还未输出
测试验证
输入文件test.txt内容:
817399;"john";; 817399;"CCE";; 817399;"smith";; 817399;"Ron";; 817400;; 817400;; 817400;; 818000;"ODC";; 890021;; 890021;; 890021;"rachel";; 890021;"monica"``` 执行命令后输出: ```818522;"Joey";; 817399;"Ron";; 817400;; 818000;"ODC";; 890021;"monica"``` 完全符合你的期望输出。 内容的提问来源于stack exchange,提问作者José Souza
相关产品推荐
相关产品推荐

