awk:打印两个文件的重复项

awk:打印两个文件的重复项

文件1:

23455|abc|xyz
23455|abc|xsd
34433|wer|sad
45655|fdf|fcd

文件2:

v343v|23455
z565z|23455
c9898|34433
b2323|45655

输出应该是:

23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

我正在使用以下命令:

awk -F'|' 'NR==FNR { a[$1]=$1"|"$2"|"$3; next} $2 > 0 {print a[$2] "|" $1}' file1 file2 > result.txt

但它只显示结果:

23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

注意:这两个文件的数据都是随机顺序的

答案1

$ join -t '|' -2 2 file1 file2
23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

这对两个文件执行关系 JOIN 操作。告诉-t '|'它用作输入数据中的字段分隔符,并告诉它使用两个文件中的第二个文件(而不是第一个)中的第二个字段join|-2 2

这假设连接列在两个文件中已排序。

它们是否未排序,然后使用对文件进行预排序

sort -t '|' -k1 -o file1 file1
sort -t '|' -k2 -o file2 file2

或者在调用时同时join在支持此功能的 shell 中使用进程替换进行排序:

join -t '|' -2 2 \
    <( sort -t '|' -k1 file1 ) \
    <( sort -t '|' -k2 file2 )

答案2

使用awk

awk 'BEGIN{FS=OFS="|"}NR==FNR{a[$0];next}{for(i in a)if(index(i,$2)==1) print i,$1}' file1 file2

循环for遍历数组中存储的 file1 的所有行a。如果第二个文件的第一个元素与数组条目匹配,则打印它。

相关内容