从 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
我的文件 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