我的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
我希望查询是可以理解的。任何人都可以帮助我。
答案 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