我有两个文本文件,一个带有一个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}'
答案 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)
使用join
和sort
(希望可移植):
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命令都使用相同的语言环境。