使用 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】:

使用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,这给出了按第一列排序的输出:

abc NA
abcd 100
cab 500
def 200
kac NA

注意 2,即使没有 LC_ALL=C,这些命令也可以工作。重要的是所有排序和连接命令都使用相同的语言环境。

【讨论】:

以上是关于使用 awk 比较两个文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 比较两个文件并打印不匹配的记录

使用awk比较两个不同文件中的两列

比较awk中两个文件的字段

AWK 比较两个文件中的两列输出匹配行 - 匹配中缺少行

awk将同一行中的两个元素与正则表达式进行比较

两个烟花之间的比较和打印所需的结果使用AWK [重复]