0

我的 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

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

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

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

4

2 回答 2

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
于 2018-09-16T20:00:48.400 回答
0

它必须是awk吗?它是通过加入完成的:

有两个文件:

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

可以将 on,作为第一个 file1 的第二个字段的分隔符加入-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
于 2018-09-16T21:01:58.113 回答