【问题标题】:Grep -f and only return the first matchgrep -f 并且只返回第一个匹配
【发布时间】:2012-09-30 15:20:19
【问题描述】:

我正在处理一个遵循基本流程的大型 CSV。

  1. 备份工作原件
  2. 生成骨架 CSV
  3. 从另一个 CSV 读取,格式化内容,然后将其附加到骨架
  4. 将备份中的数据附加到新的。

我遇到的问题是,当我从备份中读取内容时,我将grep -Ev -f 与包含正则表达式的文件一起使用,以从备份中排除不需要的数据以包含在下一个修订版中。这目前存在一个问题,因为 grep 似乎针对来自 STDIN 的每一行评估文件中的每个正则表达式,这将导致重复。简单的解决方案是简单地将其通过sort | uniq 进行管道传输,然后收工,但这将与当前使用的 csv 格式发生冲突。如果需要,我可以详细说明,但不足之处是我运行一个脚本来批量处理 IP 地址,但其他人也手动编辑文件,并且使用当前形式的脚本,最终输出将是所有自动化内容手动条目位于文件的底部。

那么,无论如何,是否有一些丑陋的 grep 循环告诉它在模式匹配后停止评估一行?使用-m 1 将在整个流中的第一个匹配之后停止 grep,我需要它在每个新行之后停止。

【问题讨论】:

  • 你能举一个这样的正则表达式和行的例子吗?我无法复制问题。
  • ^10\.* ^192\.168\.* etc... etc.. 用于 RFC1918 以及一些不必要的随机 IP 地址。问题似乎是,当我想要它找到匹配项然后停止使用文件中的表达式时,它正在针对每个表达式评估每一行。
  • 无视一切。该列表只匹配一个表达式。我使用的测试文件无意中更改了,所以我看到了重复的结果。 grep -Ev -f $list_of_expressions 会产生我想要的结果。
  • @purblemcgallister 将您的评论作为此问题的答案发布,这样它就不会在 Stack Overflow 中显示为未回答的问题。

标签: bash csv grep


【解决方案1】:

对于你想要完成的任务。我认为最好使用 AWK。您可以在 http://www.grymoire.com/Unix/Awk.html 找到一个出色的 AWK 教程。您基本上需要使用

更改 awk 的输入字段分隔符
awk -f',' foo.awk bar.dat

就排序问题而言,请遵循以下内容:http://www.linuxquestions.org/questions/linux-general-1/how-to-use-awk-to-sort-243177/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多