如何扩展双文本文件未匹配字符串查询:从第1列到第6列(分隔符||o||)
嘿,这事儿好办!咱们直接用常用的文本处理工具就能搞定,我给你两种靠谱的方案,你可以根据自己的习惯选:
方案1:用awk(无需提前排序,更灵活)
awk处理自定义分隔符和列匹配简直是拿手好戏,直接一行命令就能搞定:
awk -F'\\|\\|o\\|\\|' 'NR==FNR {keys[$6]; next} !($6 in keys)' 参考文件.txt 待检查文件.txt
我给你拆解下每个部分的作用:
-F'\\|\\|o\\|\\|':因为|是正则里的特殊字符,所以得用双反斜杠转义,这样awk才会把||o||当成真正的列分隔符NR==FNR {keys[$6]; next}:这部分是处理第一个输入文件(也就是你用来对比的参考文件),把每一行的第6列值存到一个叫keys的数组里,存完就跳过后面的逻辑处理下一行!($6 in keys):处理第二个文件(你要找未匹配行的左侧文件)时,检查当前行的第6列是不是不在keys数组里,如果不在,就输出这一行——这就是你要的未匹配内容
方案2:用join(适合需要排序输出的场景)
如果你习惯用join命令,记得join要求输入文件是按匹配列排好序的,所以我们可以结合sort一起用:
# 直接用管道生成排序后的内容,不用临时文件 join -t'||o||' -v1 -1 6 -2 6 <(sort -t'||o||' -k6,6 待检查文件.txt) <(sort -t'||o||' -k6,6 参考文件.txt)
解释下关键参数:
-t'||o||':指定列分隔符为||o||-v1:只输出第一个文件(待检查的左侧文件)中没有匹配上的行-1 6:告诉join用第一个文件的第6列作为匹配键-2 6:用第二个文件的第6列作为匹配键<(...):这是bash的进程替换特性,直接把sort的输出当成临时文件给join用,省得手动生成排序后的文件
小提醒
- 如果你的文件里第6列有空值或者特殊字符,这两个方案都能正常工作,因为都是严格按分隔符拆分列的
- 记得把命令里的
参考文件.txt和待检查文件.txt换成你实际的文件名哦
内容的提问来源于stack exchange,提问作者Dr Jay
相关产品推荐
相关产品推荐

