使用 awk 比较两个文件
Posted
技术标签:
【中文标题】使用 awk 比较两个文件【英文标题】:Comparing two files using Awk 【发布时间】:2017-01-31 22:06:34 【问题描述】:我有两个文本文件,一个包含 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==NRa[$1]++;nexta[$1]print $1,"\t",$2'
【问题讨论】:
那么,你尝试了什么? 我只能打印匹配的值。 请将该代码添加到您的问题中。 @JamesBrown 已添加 保持file1的顺序重要吗? 【参考方案1】:$ awk 'NR==FNRa[$1]=$2;next print $1, ($1 in a? a[$1]: "NA") ' file2 file1
abc NA
abcd 100
def 200
cab 500
kac NA
【讨论】:
【参考方案2】:使用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,这给出了按第一列排序的输出:
abc NA
abcd 100
cab 500
def 200
kac NA
注意 2,即使没有 LC_ALL=C,这些命令也可以工作。重要的是所有排序和连接命令都使用相同的语言环境。
【讨论】:
以上是关于使用 awk 比较两个文件的主要内容,如果未能解决你的问题,请参考以下文章