基于指定字段组合对比两个分隔符文件,提取File1独有行的Bash脚本实现需求
基于指定字段组合对比两个分隔符文件,提取File1独有行的Bash脚本实现
我来帮你搞定这个需求!核心是不对比整行内容,只对比第3和第5字段的拼接组合,找出File1中该组合未在File2出现过的原始行。用awk就能轻松实现,思路清晰且高效。
解决方案命令
直接运行这条Bash命令即可得到你想要的结果:
awk -F'*' 'NR==FNR {key[$3$5]++; next} !($3$5 in key)' File2 File1
命令详细解释
咱们拆解一下这条命令的每个部分,方便你理解和调整:
-F'*':告诉awk,字段的分隔符是*,这样它就能正确拆分每行的各个字段。NR==FNR:这是awk里常用的判断,用来识别当前处理的是第一个输入文件(这里是File2)。NR是全局累计的行号,FNR是当前文件内的行号,处理第一个文件时两者相等。key[$3$5]++:在处理File2时,把每行的第3字段和第5字段拼接成一个唯一“键”,存入关联数组key中(计数加1只是标记这个组合存在,具体数值不重要)。next:跳过当前行的后续处理,直接进入下一行,确保File2的行只做存键的操作。!($3$5 in key):处理第二个文件(File1)时,检查当前行的第3+第5字段组合是否不在key数组里——如果不在,就输出这一行(awk默认会输出匹配条件的整行)。
验证你的示例
用你给出的File1和File2测试这条命令:
- File2中存的组合有:
1111111222222、2222222333333、4444444555555、5555555666666、7777777888888 - File1的行对应的组合:
qwerty*asd*1111111*poiu*222222*mnb→ 组合1111111222222(在File2存在,跳过)nbcvxm*hjf*3333333*jhjd*444444*bvc→ 组合3333333444444(不在File2,输出)dhfkjs*bmb*5555555*vcxz*666666*ewr→ 组合5555555666666(在File2存在,跳过)
最终输出正好是你预期的结果:
nbcvxm*hjf*3333333*jhjd*444444*bvc
额外提示
如果你的字段里可能包含特殊字符(比如空格),这个脚本依然有效,因为awk的字段拆分只基于你指定的*分隔符。要是以后需要调整对比的字段,只需要把$3$5改成对应的字段编号就行(比如要对比第2和第4字段,就改成$2$4)。
备注:内容来源于stack exchange,提问作者user1746775
相关产品推荐
相关产品推荐

