【问题标题】:compare strings two files with awk用awk比较字符串两个文件
【发布时间】:2020-10-07 23:48:21
【问题描述】:

我正在尝试将 file1 中的字段 5 与 file2 中的字段 2 进行比较,并在它们相等时显示行。

文件1

"202005";"RS";"4301602";"CITY";"12651500714";"***.368.660-**";"TESTE TESTE";"-2";""
"202005";"RS";"4301602";"BAGE";"00000000000";"***.977.440-**";"XXXXX XXXEZ";"-2";""

文件2

"93330090006";"12651500714";"TESTE XX";
"01168199018";"16108835006";"SOME NAME";

我搜索并使用了很多代码,但它不起作用。 我最后的代码:

awk -F";"  'NR==FNR{a[$4,$2];next} ($0) in a' file1 file2

预期的结果可以是 file1 的整行:

"202005";"RS";"4301602";"CITY";"12651500714";"***.368.660-**";"TESTE TESTE";"-2";""

【问题讨论】:

  • 能否请您在帖子中添加预期输出,以便更好地理解您的问题。
  • join 命令可以为您执行此操作。在此处搜索 [linux] join[bash] join 。祝你好运。``

标签: bash awk


【解决方案1】:

你可以试试这个代码:

awk 'BEGIN{FS=";"} FNR == NR {seen[$2]; next} $5 in seen' f2 f1
"202005";"RS";"4301602";"CITY";"12651500714";"***.368.660-**";"TESTE TESTE";"-2";""

此命令将仅打印 file2 中的行,其中 file1 的第 5 列与 file2 的第 2 列相同。

【讨论】:

    【解决方案2】:

    另一种解决方案是使用 *nix 实用程序 join

     join -t\; -1 5 -2 2 -o 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 f1.txt f2.txt
    

    产生输出

    "202005";"RS";"4301602";"CITY";"12651500714";"***.368.660-**";"TESTE TESTE";"-2";""
    

    请注意,这两个文件都需要按其关键字段排序。如果您的数据需要排序,可以使用流程替换在线完成:

    join -1 5 -2 2 -t\; <(sort -t\; -k5 f1.txt)  <(sort -t\; -l2 f2.txt)
    

    还要注意join 的灵活性,因为您可以在文件编号之后指定关键字段编号,即在本例中为-1 5

    最后,请注意,如果您想要两个文件的“联合”输出,则命令会更简单,即

    join -t\; -1 5 -2 2 f1.txt f2.txt
    

    在一行上生成第一个文件和第二个文件的输出。请注意,关键字段不包括在文件 2 输出中。

    "12651500714";"202005";"RS";"4301602";"CITY";"***.368.660-**";"TESTE TESTE";"-2";"";"93330090006";"TESTE XX";
    

    对于初学者,man join 是对功能的简洁描述。寻找与您的学习风格相匹配的在线教程,或在此处搜索,因为有很多关于该主题的 Q/A(通常作为类似 Q 的答案)。

    IHTH

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2020-03-23
      • 2017-01-31
      • 2017-07-25
      • 2012-09-05
      • 2021-01-27
      • 2014-05-31
      • 2014-12-25
      相关资源
      最近更新 更多