Awk 使用可搜索密钥比较2个文件
你好 我一直在试图找到一个类似问题的解决方案,但我似乎无法解决它。正在寻求某种帮助 我有两个文件,我想比较。文件1和文件2的实体模型内容如下所示: 文件1:Awk 使用可搜索密钥比较2个文件,awk,gawk,Awk,Gawk,你好 我一直在试图找到一个类似问题的解决方案,但我似乎无法解决它。正在寻求某种帮助 我有两个文件,我想比较。文件1和文件2的实体模型内容如下所示: 文件1: 50 0004312805201 06740 2310821
50 0004312805201 06740 2310821
50 0004986504201 00845 2310837
50 0003913155201 47679 2310762
50 0004997395201 2035 2311180
50 0001147242201 15000 23108723
50 0005771878201 13545 I3840000
0003913155 A
0005771878 A
0004312805 A
0000000015 B
0000000012 B
1111111111 E
50 0004312805201 06740 2310821 A
50 0004986504201 00845 2310837 NO
50 0003913155201 47679 2310762 A
50 0004997395201 2035 2311180 NO
50 0001147242201 15000 23108723 NO
50 0005771878201 13545 I3840000 A
文件2:
50 0004312805201 06740 2310821
50 0004986504201 00845 2310837
50 0003913155201 47679 2310762
50 0004997395201 2035 2311180
50 0001147242201 15000 23108723
50 0005771878201 13545 I3840000
0003913155 A
0005771878 A
0004312805 A
0000000015 B
0000000012 B
1111111111 E
50 0004312805201 06740 2310821 A
50 0004986504201 00845 2310837 NO
50 0003913155201 47679 2310762 A
50 0004997395201 2035 2311180 NO
50 0001147242201 15000 23108723 NO
50 0005771878201 13545 I3840000 A
我需要在文件1的字段2上执行子字符串
,以生成10个字符长度的可搜索键值
,并在文件2的字段1中找到匹配值
如果找到匹配项,则打印整个file1行,并将file2中的field2作为新字段追加
如果不匹配,则打印整个file1行,并将字符串“no”作为新字段追加。最好将输出重定向到文件
示例输出如下所示
输出:
50 0004312805201 06740 2310821
50 0004986504201 00845 2310837
50 0003913155201 47679 2310762
50 0004997395201 2035 2311180
50 0001147242201 15000 23108723
50 0005771878201 13545 I3840000
0003913155 A
0005771878 A
0004312805 A
0000000015 B
0000000012 B
1111111111 E
50 0004312805201 06740 2310821 A
50 0004986504201 00845 2310837 NO
50 0003913155201 47679 2310762 A
50 0004997395201 2035 2311180 NO
50 0001147242201 15000 23108723 NO
50 0005771878201 13545 I3840000 A
你们建议我如何通过awk
或gnuawk
解决这个问题?在准备可搜索密钥子字符串并在awk/GNU awk
中使用它来构建数组时遇到问题
任何帮助都将不胜感激。我正在旋转我的轮子
谢谢
awk '
FNR==NR{ a[$1]=$2; next }
{ s=substr($2,1,10); print $0,(s in a ?a[s]:"No") }
' file2 file1 > your_output_file
输入:
$ cat file1
50 0004312805201 06740 2310821
50 0004986504201 00845 2310837
50 0003913155201 47679 2310762
50 0004997395201 2035 2311180
50 0001147242201 15000 23108723
50 0005771878201 13545 I3840000
$ cat file2
0003913155 A
0005771878 A
0004312805 A
0000000015 B
0000000012 B
1111111111 E
输出
$ awk 'FNR==NR{a[$1]=$2;next}{s=substr($2,1,10);print $0, (s in a ? a[s] : "No") }' file2 file1
50 0004312805201 06740 2310821 A
50 0004986504201 00845 2310837 No
50 0003913155201 47679 2310762 A
50 0004997395201 2035 2311180 No
50 0001147242201 15000 23108723 No
50 0005771878201 13545 I3840000 A
不确定OP在
中的含义生成一个10个字符长度的可搜索键值。我将其解释为:file2的字段1中的值必须是file1中字段2的子字符串
输入
$ cat file1
50 0004312805201 06740 2310821
50 0004986504201 00845 2310837
50 0003913155201 47679 2310762
50 0004997395201 2035 2311180
50 0001147242201 15000 23108723
50 0005771878201 13545 I3840000
及
调用tst.awk将生成输出:
$ awk -f tst.awk file2 file1
50 0004312805201 06740 2310821 A
50 0004986504201 00845 2310837 NO
50 0003913155201 47679 2310762 A
50 0004997395201 2035 2311180 NO
50 0001147242201 15000 23108723 NO
50 0005771878201 13545 I3840000 A
或者,使用oneliner:
$ awk '/^[0-9]/ && NR==FNR { a[$1]=$2; next } /^[0-9]/{f=0;for (i in a){if (index($2, i)){print $0, a[i];f++;break;}}}/^[0-9]/ && !f{ print $0, "NO" }' file2 file1
要生成一个10个字符长的可搜索密钥-该密钥是否可以从字段的开头开始?可能的重复项我将在明天查看提供的反馈并回复评论。感谢所有的回应。