Awk 当两个不同的列匹配时,打印两个文件中的行
我有两个tab delim文件Awk 当两个不同的列匹配时,打印两个文件中的行,awk,Awk,我有两个tab delim文件 file 1 B T 4 tab - 1 C 5 - cab 5 A 2 - ttt D T 18 1111 - file 2 K A 3 0.1 T B 4 0.3 P 1 5 0.5 P 5 2 0.11 我需要根据文件1 col1和3和文件2 col2和3合并这两个文件,并在两个文件中打印行。我期待以下输出: B T 4 tab - T B 4 0.3 1 C 5 - cab P 1 5 0.5 5 A 2 - ttt P 5 2 0.
file 1
B T 4 tab -
1 C 5 - cab
5 A 2 - ttt
D T 18 1111 -
file 2
K A 3 0.1
T B 4 0.3
P 1 5 0.5
P 5 2 0.11
我需要根据文件1 col1和3
和文件2 col2和3
合并这两个文件,并在两个文件中打印行。我期待以下输出:
B T 4 tab - T B 4 0.3
1 C 5 - cab P 1 5 0.5
5 A 2 - ttt P 5 2 0.11
我试着根据我过去遇到的一个类似问题进行改编:
awk 'NR==FNR {a[$1,$3] = $2"\t"$4"\t"$5; next} $2,$3 in a {print a[$1,$3],$0}' file1 file2
但没有成功,我得到的输出如下所示,类似于file2:
K A 3 0.1
T B 4 0.3
P 1 5 0.5
P 5 2 0.11
代码中有两个小问题:
awk 'NR==FNR{a[$1,$3]=$0; next} ($2,$3) in a {print a[$2,$3], $0}' file1 file2
# parentheses -^ ----^
# $2,$3 ----^
你似乎接近解决方案了。到底是什么问题?你用你的代码能得到什么?您确定分隔符是选项卡而不是单个空格吗?为什么写
a[$1,$3]=$2“\t”$4“\t”$5
而不是a[$1,$3]=$0
<代码>打印[$1,$3],$0应该是打印[$2,$3],$0
不是吗?是的,打印[$2,$3],$0,谢谢!请你澄清一下这部分好吗?我不明白…是的,正如Sheller所说,你似乎不太明白awk的诀窍来执行file1和file2的部分代码,即:NR==FNR{code for file1;next}{code for file2}
(为拼写而编辑,doah!)你需要$2,$3
作为你的密钥,因为你正在“操作”你的第二个文件,其中您的钥匙是$2,$3
。但是您使用第一个文件中的key=$1、$3
将数据存储在数组中。钥匙应该这样匹配,如果您使用第二个文件中的$1,$3
,钥匙将不会匹配好运!请你解释一下为什么需要括号好吗?POSIX说应该加括号:。gawk
手册在这里提到了它们:。