【问题标题】:Awk: compare contents of two files, print matches and non matchesawk:比较两个文件的内容,打印匹配和不匹配
【发布时间】:2021-06-15 02:16:00
【问题描述】:

我想比较两个文件 File1.txt 和 File2.txt 的内容。当 File2.txt 的第 1 列中的一行与 File1.txt 的第 1 列中的行匹配时,我想从 File2.txt 输出整行。如果 File1.txt 的第 1 列中的行在 File2.txt 中不匹配,那么我想打印 File1.txt 的第 1 列中的行的内容,然后是制表符,然后是 0。我还想尝试在输出中保留第 1 列中的行顺序。

文件1.txt

abc
def
ghi
jkl

文件2.txt

abc    2
ghi    1

这是我一直在使用的命令,但它只输出匹配的实例。它不会打印没有匹配项后跟以制表符分隔的 0 的实例。

awk 'NR==FNR{a[$1];next} $1 in a{if ($1 in a) print $0;else print a[$1],"\t","0"}' File1.txt File2.txt 

我认为下面的代码在做什么:

awk 'NR==FNR{a[$1];next}:为第一个文件的第 1 列创建一个数组。

$1 in a : 遍历数组。

{if ($1 in a) print $0; 如果 File2.txt 中的行与数组中的行匹配,则打印 File2.txt 中的所有行

;else print a[$1],"\t","0"}' : 如果 File2.txt 中的行与数组中的行不匹配,则打印 File1.txt 中的行,制表符,然后是“0”。

但显然不是这样。我不明白我做错了什么。

当前输出:

abc    2
ghi    1

期望的输出:

abc    2
def    0
ghi    1
jkl    0

谁能解释为什么在没有匹配的情况下不打印contents of line in File1.txt,\t,0

【问题讨论】:

    标签: awk


    【解决方案1】:

    请您尝试以下操作。用显示的样本编写。您应该在 awk 中更改 Input_file(s) 的读取顺序。在 file2.txt 之后读取 file1.txt 的另一个原因是因为输出是按照 file1 打印的,并且它正在比较 file2 的值,所以最好先读取 file2 将所有值都放在数组中,然后再读取 file1 打印值相应地

    awk '
    FNR==NR{
      arr[$1]=$2
      next
    }
    {
      print $0,($1 in arr?arr[$1]:0)
    }
    ' file2.txt file1.txt
    

    【讨论】:

    • 太好了,谢谢。这完美!我现在看到在 file2 之后读取 file1 会更有意义。请您向我解释一下打印声明好吗?我对arr?arr[$1]不熟悉。
    • @Jpike,这些是三元运算符,如果第一个字段存在于 arr 中,则检查条件,然后打印其值,否则打印 0。
    猜你喜欢
    • 2012-10-18
    • 2012-09-05
    • 2016-07-30
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多