用awk匹配两个文件并输出所选字段

时间:2018-10-24 16:01:56

标签: awk

我想比较两个以分隔的文件

; 

具有相同字段1, 输出文件1的field2和文件2的field2 field1。

文件1:

16003-Z/VG043;204352
16003/C3;100947
16003/C3;172973
16003/PAB4L;62245
16003;100530
16003;101691
16003;144786

文件2:

16003-Z/VG043;568E;0540575;2.59
16003/C3;568E;0000340;2.53
16003/PAB4L;568H;0606738;9.74
16003;568E;0000339;0.71
16003TN9/C3;568E;0042261;3.29

所需的输出:

204352;568E;16003-Z/VG043
100947;568E;16003/C3
172973;568E;16003/C3
62245;568H;16003/PAB4L
100530;568E;16003
101691;568E;16003
144786;568E;16003

我的尝试:

awk -F\, '{FS=";"} NR==FNR {a[$1]; next} ($1) in a{ print a[$2]";"$2";"$3}' File1 File2 > Output

上面的方法不起作用,可能是因为awk仍然使我难以理解。 问题是什么驱动了输出? $1$2等是什么意思? 我打算使用a[$2]是文件1的field2。...但不是...

我得到的是:

;204352;16003-Z/VG043
;100947;16003/C3
;172973;16003/C3
;62245;16003/PAB4L
;100530;16003
;101691;16003
;144786;16003

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这可能是您想要的:

awk -F";" '(NR==FNR) { a[$1] = ($1 in a ? a[$1] FS : "") $2; next }
           ($1 in a) { split(a[$1],b); for(i in b) print b[i] FS $2 FS $1 }' file1 file2

这将输出:

204352;568E;16003-Z/VG043
100947;568E;16003/C3
172973;568E;16003/C3
62245;568H;16003/PAB4L
100530;568E;16003
101691;568E;16003
144786;568E;16003

答案 1 :(得分:1)

此方法通过file_1.txt将文件first读入关联数组table中。 (这样做是为了在文件之间关联ids / values。)然后,循环遍历2 nd 文件file_2.txt,我在table中打印与该文件以及当前值:

BEGIN {
    FS=OFS=";"
    while (getline < first)
        table[$1] = $2 FS table[$1]
}

$1 in table {
    len = split(table[$1], parts)
    for (i=1; i<len; i++)
        print parts[i], $2, $1
}

$ awk -v first=file_1.txt -f script.awk file_2.txt

204352;568E;16003-Z/VG043
172973;568E;16003/C3
100947;568E;16003/C3
62245;568H;16003/PAB4L
144786;568E;16003
101691;568E;16003
100530;568E;16003