文件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
搜索和awk
或cut
来获取第一个字段:
$ 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