【问题标题】:awk compare 2 files, print match and nonmatch lines;3rd column of first file and 2nd column of second fileawk 比较 2 个文件,打印匹配和不匹配行;第一个文件的第三列和第二个文件的第二列
【发布时间】:2014-01-20 20:12:50
【问题描述】:

在此示例中,需要比较两个文件 f1.txt 和 f2.txt 并获得匹配项和不匹配项,对于这种情况,我希望匹配第二个文件的第 2 列和第一个文件的第 3 列。并首先打印 f2.txt 的第二个字段,然后打印 f1.txt 的整行。如果在 f2.txt 上找不到匹配项,请声明“未找到”,然后打印 f1.txt 整行。

F1.txt

2;3;1;4;5;6;7;8
2;3;1a;4;5;6;7;8
2;3;1b;4;5;6;7;8
2;3;2b;4;5;6;7;8

F2.txt

First;1
Firsta;1a
Firstb;1b

期望的输出:

First;1;2;3;1;4;5;6;7;8
Firsta;1a;2;3;1a;4;5;6;7;8
Firstb;1b;2;3;1b;4;5;6;7;8
Not Found;Not Found;2;3;2b;4;5;6;7;8

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    这可以是一种方式:

    awk 'BEGIN{FS=OFS=";"}
         FNR==NR {a[$2]=$0; next}
         { t=($3 in a)?a[$3]:"Not found"OFS"Not found"; print t,$0}' f2 f1
    

    返回:

    $ awk 'BEGIN{FS=OFS=";"}FNR==NR {a[$2]=$0; next} { t=($3 in a)?a[$3]:"Not found"OFS"Not found"; print t,$0}' f2 f1
    First;1;2;3;1;4;5;6;7;8
    Firsta;1a;2;3;1a;4;5;6;7;8
    Firstb;1b;2;3;1b;4;5;6;7;8
    Not found;Not found;2;3;2b;4;5;6;7;8
    

    说明

    基本上它取自 http://backreference.org/2010/02/10/idiomatic-awk/ 。唯一需要解释的方面应该是:

    • t=($3 in a)?a[$3]:"Not found"OFS"Not found"。它是一个三元运算符var= check_condition ? value_if_true : value_otherwise。所以t 包含我们需要的行,如果该值在第二个文件中;否则,它包含“未找到”值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多