Awk 使用可搜索密钥比较2个文件

Awk 使用可搜索密钥比较2个文件,awk,gawk,Awk,Gawk,你好 我一直在试图找到一个类似问题的解决方案,但我似乎无法解决它。正在寻求某种帮助 我有两个文件,我想比较。文件1和文件2的实体模型内容如下所示: 文件1: 50 0004312805201 06740 2310821

你好

我一直在试图找到一个类似问题的解决方案,但我似乎无法解决它。正在寻求某种帮助

我有两个文件,我想比较。文件1和文件2的实体模型内容如下所示:

文件1:

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个字符长的可搜索密钥-该密钥是否可以从字段的开头开始?可能的重复项我将在明天查看提供的反馈并回复评论。感谢所有的回应。