从file1中的file2中查找在file2中具有扩展列的行

时间:2016-08-10 20:12:48

标签: awk split file-comparison

我将file1作为:

ABC CDEF HAGD CBDGCBAHS:ATSVHC
NBS JHA AUW MNDBE:BWJW
DKW QDW OIW KNDSK:WLKJW
BNSHW JBSS IJS BSHJA
ABC CDEF CBS 234:ATSVHC
DKW QDW FSD 634:WLKJW

和file2:

ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253
KAB GCBS YSTW SHSEB:AGTW:THE:193

我想基于第1,2,3和4列比较文件1和文件2,不同之处在于file2中的第4列有一些扩展要比较,使用

awk 'FNR==NR{seen[$1,$2,$3,$4;next} ($1,$2,$3,$4) in seen' file1 file2

我可以调整什么来使其具有可比性,以便我的输出是file2中的匹配行:

ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253

2 个答案:

答案 0 :(得分:2)

据我了解,您希望从file2打印具有字段1,2,3的行,这些行匹配file1中的相应字段,并且在file1中的字段2中匹配字段4的字段4的开头部分。在那种情况下:

$ awk 'FNR==NR{seen[$1,$2,$3,$4];next} {a=$4; sub(/:[^:]*:[^:]*$/, "", a)} ($1,$2,$3,a) in seen' file1 file2
ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253

如何运作

  • FNR==NR{seen[$1,$2,$3,$4];next}

    在读取第一个文件file1时,我们添加一个等于前四个字段的ato关联数组seen。然后我们跳过其余的命令并跳转到next行。

  • a=$4; sub(/:[^:]*:[^:]*$/, "", a)

    如果我们到达这里,那意味着我们正在处理file2。

    这会将字段4的值分配给变量a,然后从a中删除最后两个冒号分隔的字符串。

  • ($1,$2,$3,a) in seen

    这将打印file2中前三个字段和a是关联数组seen中的键的任何行。

答案 1 :(得分:2)

只需在FS中加入:

$ awk -F'[ :]' 'NR==FNR{a[$1,$2,$3,$4,$5];next} ($1,$2,$3,$4,$5) in a' file1 file2
ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253