使用awk命令的Vlookup

时间:2018-09-16 13:44:54

标签: bash awk

我的linux服务器中有两个文件。

文件1

9190784
9197256
9170546
9184139
9196854

文件2

S NO.,Column1,Column2,Column3
72070,9196854,TGM,AP
72071,9172071,BGM,MP
72072,9184139,AGM,KN
72073,9172073,TGM,AP

我想使用awk命令在bash中编写脚本或单行命令,因此无论文件-1中的元素如何与文件-2中的列1匹配,并打印列1,列2和列3。另外,如果未找到任何条目,则应从文件1打印条目,并在第2列和第3列中打印NA

Output:它将输出重定向到一个新文件,如下所示。 new_file

9190784,TGM,AP
9197256,NA,NA
9170546,NA,NA
9184139,AGM,KN
9196854,TGM,AP

我希望查询是可以理解的。任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

使用awk的标准联接操作

$ awk 'BEGIN   {FS=OFS=","} 
       NR==FNR {a[$2]=$3 OFS $4; next} 
               {print $1, (($1 in a)?a[$1]:"NA" OFS "NA")} file2 file1

子字符串变体(未经测试)

$ awk 'BEGIN   {FS=OFS=","} 
       NR==FNR {a[substr($2,1,7)]=$3 OFS $4; next} 
               {key=substr($1,1,7);
                print $1, ((key in a)?a[key]:"NA" OFS "NA")} file2 file1

答案 1 :(得分:0)

一定要awk吗?这是通过join完成的:

有两个文件:

echo '9190784
9197256
9170546
9184139
9196854' >file2

echo 'S NO.,Column1,Column2,Column3
72070,9196854,TGM,AP
72071,9172071,BGM,MP
72072,9184139,AGM,KN
72073,9172073,TGM,AP' > file1

一个人可以加入,作为第一个文件1 -12中第二个字段的分隔符,并删除第一标题行tail -n +2并使用第二个字段sort -t, -k2进行排序第二个文件-21中的第一个字段排序为sort

join -t, -12 -21 -o1.2,1.3,1.4 <(tail -n +2 file1 | sort -t, -k2) <(sort file2)

将输出:

9184139,AGM,KN
9196854,TGM,AP