【问题标题】:cut & to fields 1 & 2 from file_A and use them as the pattern for a line in file_B and echo results从 file_A 中剪切 & 到字段 1 和 2,并将它们用作 file_B 中一行的模式并回显结果
【发布时间】:2013-06-01 07:15:33
【问题描述】:

我有 2 个非常大的文件(每个超过 900 兆),格式为

email@address.tld:some_string:full name:location:contract_number

我需要使用 file_A (chk.forward.AUDIT.DATA.SET) 中的字段 1 和 2 作为模式来匹配 file_b (AUDIT.DATA.SET) 中单行中的字段 1 和 2。我愿意使用 sed、awk、grep、cut 或任何可以加快执行速度的东西。

下面是我写得不好的命令。我在这里有一个错误,正在创建一个怪物大小的结果文件(比原始文件大)。我确信有更好的方法来做到这一点。

while read line; do grep $(echo $line | cut -d: -f2) AUDIT.DATA.SET
>/dev/null && echo "AUDIT PASS ACCOUNT:$(echo $line | cut -d: -f1) FORWARD:$(echo $line | cut -d: -f2) MATCH OVD RECORD $(grep $(echo $line |cut -d: -f2) AUDIT.DATA.SET)" &  || echo "AUDIT FAIL ACCOUNT:$(echo $line | cut -d: -f1) FORWARD:$(echo $line | cut -d:
-f2) NO MATCH $(grep $(echo $line |cut -d: -f2) AUDIT.DATA.SET)"  ; done < chk.forward.AUDIT.DATA.SET >> restuls.txt

【问题讨论】:

  • 您的预期输出是什么?您提到了 2 个文件,但只提供了一个文件的格式。
  • 它们是格式。谢谢你问

标签: sed awk grep field cut


【解决方案1】:

假设您的两个文件具有相同的格式,正如您在问题中解释的那样。你可以试试 awk 的关联数组:

awk -F: 'NR==FNR{a[$1$2];next}$1$2 in a' file_a file_b > result.txt

上面的行会将所有匹配的结果保存在 result.txt 中。它查找file_b中的所有行,其中column1和column2存在于file_a中。

【讨论】:

  • 肯特,谢谢,我如何修改这条 awk 行以添加失败的匹配和回显匹配或不匹配?
  • awk -F: 'NR==FNR{a[$1$2];next}$1$2 in a{print &gt; "matched";next}{print &gt; "failed"' file_a file_b 试试这个。没有测试,但应该工作。希望。 :D 执行该行后,您有两个文件 matchedfailed
  • 肯特,运行时出错。我认为错误是在输出到文件之前强制转换的,因为没有创建匹配和失败。 awk: 源代码第 1 行上下文的语法错误是 >>>
  • @user2455949 是的,缺少}。只需在 "failed"' 之后和 file_a 之前添加一个 } 。对不起
  • 不必为你在帮助我的肯特感到抱歉。坏消息,看起来所有文件都失败了。
猜你喜欢
  • 2011-07-21
  • 2021-02-21
  • 2018-06-30
  • 1970-01-01
  • 2015-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多