比较两个列表并从每个列表中打印选择列

问题描述:

我想比较两个列表并从一个列表中打印一些列,如果两个匹配,则打印一些列。我怀疑我很接近,但我想这是最好检查..比较两个列表并从每个列表中打印选择列

一号文件: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 
+1

啊哈..我错过了=在[$ 3] ...我想知道为什么在打印没有工作... – Turtle

+1

@Turtle前添加[$ 1] $ 1 - 你可能想要花点时间真正想想这个解决方案,因为你显然认为如果没有早期填充它[a [$ 1]'就会以某种方式包含你想要的东西,并且通过在创建数组索引后为某个不同的变量赋值('a [$ 3]; b = $ 1'),这会以某种方式将变量'b'与'a []'的内容相关联。 awk中的数组是一个非常常用和强大的工具,在处理更复杂的问题之前,理解这个非常基础的应用程序非常重要。我建议你获得Arnold Robbins的第四版Effective Awk Programming。 –