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

finding rows from file2 in file1 which have extended columns in file2

我的文件 1 为:

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,除了文件 2 中的第 4 列有一点扩展名可以比较,使用

awk 'FNR==NR{seen[,,,;next} (,,,) 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

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

$ awk 'FNR==NR{seen[,,,];next} {a=; sub(/:[^:]*:[^:]*$/, "", a)} (,,,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[,,,];next}

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

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

    如果我们到达此处,则意味着我们正在处理文件 2。

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

  • 中删除最后两个以冒号分隔的字符串
  • (,,,a) in seen

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

只需在 FS 中包含 ::

$ awk -F'[ :]' 'NR==FNR{a[,,,,];next} (,,,,) 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