【问题标题】:Awk With Input File Match and Pattern Search带有输入文件匹配和模式搜索的 awk
【发布时间】:2015-07-07 19:19:24
【问题描述】:

对不起,我从来没有在这样的板上问过问题,请原谅没有经验。

我正在尝试从输入文件中获取一个字段,例如来自 abc.txt 的字段二,并在 def.txt 中匹配它。问题是我还需要匹配 def.txt 文件中的附加模式。

例如,abc.txt 中的字段 2 为“3”。我想在 def.txt 中搜索的模式是“efg”。我需要它返回匹配模式“efg”并包含“3”的所有行。

作为一个附加约束,我希望它在达到某个值后停止搜索,比如“END”。我已经竭尽全力在 awk 或任何变体中为此找到一个简单的衬里。

我对所有这些问题都感到困惑,作为新手可以寻求帮助吗?任何帮助表示赞赏,谢谢。

这是代码,它根本不起作用: awk 'BEGIN { FS = " " } ;NR==FNR{a[$2]=++i;next} '{if ( $5 in a) && ($0 ~ '/efg/')} {print $0}' abc.txt def.txt

我正在努力实现 3 件事:

  1. 将输入文件字段与 def.txt 字段匹配

  2. 匹配 def.txt 中的模式

  3. 遇到值时停止搜索,例如“END”。

如果可能的话,希望有一个单一的解决方案,我只是一个 AWK 初学者。

Sample Input 
Abc.txt
1
2
3
4

Def.txt
1 abc
1 efg
1 efg some more data
END
2 ghi
2 efg
2 efg some more data
END
3 jkl
3 efg
3 efg some more data
END

等等……

Expected Output 
1 efg
1 efg some more data
2 efg
2 efg some more data
3 efg 
3 efg some more data

并在任何帮助下让它在到达“END”时停止。而不是遍历整个文件并打印 1 efg、2 efg 等的后续实例。

【问题讨论】:

  • abc.txt 中的“3” 匹配 def.txt 中的“efg” 和两个文件中的打印行?这两个文件都是空格分隔的吗?哪个文件包含“END”?
  • 你想用'/efg'/ 完成什么?无论如何,发布一些示例输入和预期输出。
  • @haifzhan - 我需要该行的文件在 def.txt 中。我正在寻找 def.txt 中与 abc.txt 中的“3”和 def.txt 中的“efg”匹配的行。 “END”语句也在我需要从中获取结果的文件中。抱歉没有详细说明,我正在学习如何有效地发帖。

标签: bash awk sed


【解决方案1】:

您现有的代码存在一些明显的问题。您提供:

awk 'BEGIN { FS = " " } ;NR==FNR{a[$2]=++i;next} '{if ( $5 in a) && ($0 ~ '/efg'/)} {print $0}' abc.txt def.txt

我知道你打算用这个去哪里。我想你的意思是:

awk '

  # Step through first file, recording $2 in an array...
  NR==FNR {
    a[$2];
    next;
  }

  # Hard stop if we get a signal...
  $0 == "END" {
    quit;
  }

  # In the second+ file, test a condition.
  $5 in a && /efg/

' abc.txt def.txt

您当然可以通过删除 cmets 和换行符将其压缩成一个衬里:

awk 'NR==FNR{a[$2];next} $0=="END"{quit} $5 in a && /efg/' abc.txt def.txt

显着变化:

  • 单引号需要包裹整个脚本。一个在开头,一个在结尾,没有“内部”。
  • Awk 默认按空格拆分,因此可能不需要 FS(除非您的字段中有制表符,在这种情况下您可以放回 FS)。
  • 您不需要增加计数器。在 awk 中,如果您只是 提及 一个数组元素,它会被“创建”而没有内容,因此您可以使用 $5 in a 之类的条件而不会浪费太多内存。
  • 删除了额外的if 语句。 awk 采用condition { statement } 模式。条件是一个条件,无论它是采用这种格式还是在if 中。
  • 条件的第二个元素被缩减为一个正则表达式。默认情况下,awk 会将此表示“此正则表达式是否适用于当前输入行”。
  • print $0 命令已被删除,因为如果未提供任何语句,这是默认行为。

【讨论】:

  • 我收到一条错误消息:awk: fatal: can't open source file NR==FNR { a[$2]; next; } $5 in a && /efg/ ' for reading (No such file or directory) 我想你的意思是让我在第二条评论之后自己格式化命令。我只是不确定。
  • 啊,我真傻。从行中删除-f。我已将其从答案中删除。
  • 哦,我添加了您的“硬停”条件。
  • 亲爱的@ghoti, awk 的一个有趣结果:结果不是按顺序给出的。换句话说,似乎输出了数组内容满足的任何条件。我希望它会按照 abc.txt 的内容顺序执行测试。它将输出遇到的 def.txt 的第一个结果,该结果存在于 abc.txt 中。我希望它把第一个条目的第一个实例放在 def.txt 中,然后是第二个,依此类推。请问,有什么办法可以帮我完成吗?我认为 awk 是一个读行命令,这是一个重大挫折。
猜你喜欢
  • 1970-01-01
  • 2014-05-21
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多