如何用awk去除文件中含重复WordC:WordD模式的行?
用AWK按指定模式去重行:保留唯一的WordC:WordD模式行
你之前的命令问题在于用整行内容作为去重判断依据(seen[$0]),但你的需求是基于行内的WordC:WordD模式去重——只要这个模式重复,不管整行其他内容差异,都要过滤重复行。核心是要提取每行中的目标模式作为去重的键。
解决方案(GNU AWK 4.0+)
awk 'match($0, /[a-zA-Z]+:[a-zA-Z]+/, m) { if (!seen[m[0]]++) print }' file.txt
命令解释
match($0, /[a-zA-Z]+:[a-zA-Z]+/, m):匹配当前行中的字母:字母模式,将匹配结果存入数组m,m[0]就是完整的目标模式字符串(比如bear:tiger)。!seen[m[0]]++:判断该模式是否未出现过,第一次匹配时条件为真,打印当前行,同时将seen[m[0]]自增标记为已出现;后续再遇到相同模式时条件为假,跳过打印。
兼容老版本AWK的写法
如果你的AWK版本不支持match的第三个参数(比如BSD AWK),可以用RSTART和RLENGTH提取模式:
awk '{ if (match($0, /[a-zA-Z]+:[a-zA-Z]+/)) { pattern = substr($0, RSTART, RLENGTH) if (!seen[pattern]++) print } }' file.txt
示例验证
假设file.txt内容如下:
cat dog bear:tiger mouse elephant
fox wolf bear:lion rabbit deer
bird snake bear:tiger frog fish
运行命令后将输出前两行,第三行因bear:tiger模式重复被过滤,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

