我将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
答案 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