【问题标题】:Comparing two files using Awk使用 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==NR{a[$1]++;next}a[$1]{print $1,"\t",$2}'

【问题讨论】:

  • 那么,你尝试了什么?
  • 我只能打印匹配的值。
  • 请将该代码添加到您的问题中。
  • @JamesBrown 已添加
  • 保持file1的顺序重要吗?

标签: linux parsing unix text awk


【解决方案1】:
$ 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

【讨论】:

    【解决方案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,这些命令也可以工作。重要的是所有排序和连接命令都使用相同的语言环境。

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2017-07-25
      • 2014-10-12
      • 2012-01-01
      • 1970-01-01
      • 2012-09-05
      • 2015-02-22
      • 1970-01-01
      相关资源
      最近更新 更多