Bash脚本如何删除连续行冒号前单词重复的对应行
Bash 文本处理实现方案
你可以直接使用awk完成该需求,核心逻辑是缓存上一行的冒号前key与完整行内容,对比当前行key后决定是否输出上一行内容,最终输出最后一行即可。
核心处理命令
直接输出处理后的结果到终端:
awk -F ':' '{ if(prev_key == $1) { prev = $0 } else { if(NR > 1) print prev prev_key = $1 prev = $0 } } END { print prev }' test.txt
原地修改文件的方法
方法1:GNU awk 原生原地修改(大部分Linux发行版默认支持)
gawk -i inplace -F ':' '{if(prev_key == $1){prev=$0} else {if(NR>1) print prev; prev_key=$1; prev=$0}} END{print prev}' test.txt
方法2:通用临时文件方案(兼容所有Unix类系统)
awk -F ':' '{if(prev_key == $1){prev=$0} else {if(NR>1) print prev; prev_key=$1; prev=$0}} END{print prev}' test.txt > test.tmp && mv test.tmp test.txt
逻辑说明
- 用
-F ':'指定冒号为字段分隔符,$1即可直接取到每一行冒号前的key - 若当前行key和上一行key相同,仅更新缓存的行内容为当前行,不输出旧的上一行
- 若当前行key和上一行key不同,先输出缓存的上一行,再更新缓存的key和行内容
- 遍历完全部行后输出最后缓存的行,避免遗漏尾行
- 因题目明确不存在连续超过两行key相同的情况,该逻辑可100%覆盖需求
内容的提问来源于stack exchange,提问作者arcangel
相关产品推荐
相关产品推荐

