使用Awk比较两个文件

时间:2016-09-23 06:36:46

标签: linux parsing unix text awk

我有两个文本文件,一个带有一个id列表,另一个带有一些id和相应的值。

档案1

abc
abcd
def
cab
kac

文件2

abcd   100
def    200
cab    500
kan    400

所以,我想比较两个文件并获取匹配列的值,并保留文件1中的所有id并分配" NA"对于在File2

中没有值的ID

期望的输出

abc     NA
abcd    100
def     200
cab     500
kac     NA

PS:只有Awk脚本/单行

我用来打印匹配列的代码:

awk 'FNR==NR{a[$1]++;next}a[$1]{print $1,"\t",$2}'

2 个答案:

答案 0 :(得分:3)

$ awk 'NR==FNR{a[$1]=$2;next} {print $1,  ($1 in a? a[$1]: "NA") }' file2 file1
abc NA
abcd 100
def 200
cab 500
kac NA

答案 1 :(得分:0)

使用joinsort(希望可移植):

export LC_ALL=C
sort -k1 file1 > /tmp/sorted1
sort -k1 file2 > /tmp/sorted2
join -a 1 -e NA -o 0,2.2 /tmp/sorted1 /tmp/sorted2

在bash中,您可以在一行中使用here-files:

LC_ALL=C join -a 1 -e NA -o 0,2.2 <(LC_ALL=C sort -k1 file1) <(LC_ALL=C sort -k1 file2)

注1,这给出了按第1列排序的输出:

abc NA
abcd 100
cab 500
def 200
kac NA

注2,即使没有LC_ALL = C,命令也可以工作。重要的是所有sort和join命令都使用相同的语言环境。