【问题标题】:finding rows from file2 in file1 which have extended columns in file2从 file1 中的 file2 中查找在 file2 中具有扩展列的行
【发布时间】:2016-08-11 04:34:11
【问题描述】:

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

【问题讨论】:

  • 在给定这些输入的情况下,编辑您的 Q 以显示您的预期输出。你为什么在代码中引用$5?祝你好运。

标签: awk split file-comparison


【解决方案1】:

只需在 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

【讨论】:

    【解决方案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 中的键的任何行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多