【问题标题】:Find files whose content match a line from text file从文本文件中查找内容与某行匹配的文件
【发布时间】:2020-04-06 11:00:12
【问题描述】:

我有一个文本文件 - accessions.txt(下面是这个文件的一个子集):

KRO94967.1
KRO95967.1
KRO96427.1
KRO94221.1
KRO94121.1
KRO94145.1
WP_088442850.1
WP_088252850.1
WP_088643726.1
WP_088739685.1
WP_088283155.1
WP_088939404.1

我有一个包含多个文件的目录 (*.align)。

我想查找与我的accessions.txt 文本文件中的任何行匹配的文件名 (*.align)。

我知道find . -exec grep -H 'STRING' {} + 可以查找特定的字符串(例如,用WP_088939404.1 替换字符串会返回字符串WP_088939404.1 所在的每个文件名)。

有没有办法将STRING 替换为“我的文本文件中的所有字符串”?

或者

还有其他(更好的)方法可以做到这一点吗?

我试图避免编写一个循环来读取我所有文件的内容,因为它们太多了。

非常感谢!

【问题讨论】:

  • 除了循环之外没有更简单的方法 - 您可以尝试解析 string1 \| string2 等,其中 \|表示“或”,但您可以做的另一件事是使用 grep -m1 这意味着一旦找到匹配项,它将“停止”搜索。

标签: linux bash grep find


【解决方案1】:

您正在寻找 grep 的 -f 选项。

find . -name '*.align' -exec grep -Fxqf accessions.txt {} \; -print

【讨论】:

    【解决方案2】:

    grep 可以获取与-f 匹配的模式列表。

    grep -lFf accessions.txt directory/*.align
    

    -F 告诉 grep 将这些行解释为固定字符串,而不是正则表达式模式。

    有时,还需要-w 来防止匹配内部单词,例如

    abcd
    

    不仅可以匹配abcd,还可以匹配xabcd 或abcdy。有时,如果规则更复杂,需要对输入列表进行预处理以防止不必要的匹配。

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2016-08-08
      • 1970-01-01
      • 2017-12-21
      相关资源
      最近更新 更多