如何通过匹配列数不规则的列来连接两个文件?

如何通过匹配列数不规则的列来连接两个文件?

文件1:

0000002|SLM DEV CORP                                               |PO 857
0000003|S TOPPING                                                   |APT 19
0000004|JD  BROS LTD                                                |PO 118
0000005|ZKZ SERVICES                                                |14699  CREDITVIEW RD

文件2:

0000001|GTI CONSULTING                     |4513 GLADEBROOK CRES    
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

预期输出:

0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857
0000003|S TOPPING                           |APT 19
0000004|JD PLETT BROS LTD                   |PO BOX 118
0000005|ZKZ SERVICES |ZKZ                   |14699  CREDITVIEW RD

我尝试过加入命令:

join -j1 1 -j2 1 -t'|' -o 1.1 2.2 2.3 file1 file2

由于管道分隔符,我得到了错误的输出。另外,我不能使用任何其他符号作为分隔符,因为任何符号都可以在第 2 列中使用。

我需要匹配文件 2 中的第 1 列并纵向复制第 2 列和第 3 列。

我还尝试在 file2 中循环 file1 的第 1 列数据并获取输出,但这需要很长时间,因为我的文件非常大。

答案1

简单地使用awk,如果连接字段是唯一的:

awk -F"|" 'a[$1]++' file1 file2
  • -F"|"将管道设置为分隔符
  • a[$1]++是一个条件。当条件为真时,将打印该行。当第一个字段$1出现多次时,条件成立。

如果连接字段不唯一:

awk -F"|" 'a[$1]++&&FNR!=NR' file1 file2
  • FNR!=NR: 也是一个必须为真的条件。这仅适用于file2处理的第二个文件。当您可以保证两个文件中的第一个字段是唯一的时,可以删除该条件。

答案2

单程:

awk -F"|" 'NR==FNR{a[$1];next}($1 in a)' file1 file2

这读取第一个文件并将所有键存储在数组中。处理第二个文件时,仅打印其键存在于数组中的那些行。

由于您的文件大小很大,因此不喜欢加入,因为它需要文件按排序顺序。

答案3

据我所知,您只需要file2第一个字段中存在的所有行file1。如果是这样,您可以使用grep搜索和awkcut来获取第一个字段:

$ grep -f <(cut -d '|' -f 1 file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

或者:

$ grep -f <(awk -F'|' '{print $1}' file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

相关内容