比较两个列表并从每个列表中打印选择列
问题描述:
我想比较两个列表并从一个列表中打印一些列,如果两个匹配,则打印一些列。我怀疑我很接近,但我想这是最好检查..比较两个列表并从每个列表中打印选择列
一号文件:DATA.TXT
101 0.123
145 0.119
242 0.4
500 0.88
第二个文件:的map.txt
red 1 99
blue 3 101
rob 3 240
ted 7 500
所以,如果我想比较文件2的第3列和文件1的第1列并打印文件2的第1列和文件1的全部,我试过awk 'NR==FNR {a[$3];next}$1 in a{print$0}' file2 file1
但是只打印file1中的匹配。我尝试在awk中添加x=$1
。即awk 'NR==FNR {x=$1;a[$3];next}$1 in a{print x $0} file2 file1
,但是只保存一个值$1
并且每行输出该值。我也尝试在a[$3]
中加入1美元,这显然是错误的,从而产生零输出。
理想情况下,我想获得这个输出:
blue 145 0.119
ted 500 0.88
这是文件2的第1列和匹配文件1的第一列文件2的第3列,文件1的其余部分。
答
你在第二次尝试中就已经完成了。只需将$1
的值分配给标量,您可以将其存储在数组中以备后用。
awk 'NR==FNR {a[$3]=$1; next} $1 in a {print a[$1], $0}' file2.txt file1.txt
$ cat file1.txt
101 0.123
145 0.119
242 0.4
500 0.88
$ cat file2.txt
red 1 99
blue 3 101
rob 3 240
ted 7 500
$ awk 'NR==FNR {a[$3]=$1; next} $1 in a {print a[$1], $0}' file2.txt file1.txt
blue 101 0.123
ted 500 0.88
啊哈..我错过了=在[$ 3] ...我想知道为什么在打印没有工作... – Turtle
@Turtle前添加[$ 1] $ 1 - 你可能想要花点时间真正想想这个解决方案,因为你显然认为如果没有早期填充它[a [$ 1]'就会以某种方式包含你想要的东西,并且通过在创建数组索引后为某个不同的变量赋值('a [$ 3]; b = $ 1'),这会以某种方式将变量'b'与'a []'的内容相关联。 awk中的数组是一个非常常用和强大的工具,在处理更复杂的问题之前,理解这个非常基础的应用程序非常重要。我建议你获得Arnold Robbins的第四版Effective Awk Programming。 –