0

我有 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

和文件2:

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
4

2 回答 2

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
于 2016-08-10T20:34:11.163 回答
2

据我了解,您希望从 file2 打印具有字段 1、2、3 的行,这些行与 file1 中的相应字段匹配,并且 file2 中的字段 4 的开头部分与 file1 中的字段 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 时,我们在关联数组中添加seen一个等于前四个字段的键。然后我们跳过其余的命令并跳转到该next行。

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

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

    这会将字段 4 的值分配给变量a,然后从a.

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

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

于 2016-08-10T20:19:30.730 回答