【问题标题】:how to search for a file with pattern having white space in linux如何在linux中搜索具有空格模式的文件
【发布时间】:2015-05-03 04:09:56
【问题描述】:

我正在苦苦挣扎,因此需要你的帮助(在 linux 中)。

a) 我有一个文件,其中两列由空格分隔(分隔符为“”)。事实上,我在命令行上运行了一系列管道命令,它给了我上面提到的输出。

啊啊啊啊啊啊 ccc ddd fff ggg ccc nnn fff kkk # 大约有 20,000 个这样的行。

b) 我有很多其他文件,例如 file-1.txt、file-2。 txt , file-3.txt.

问题:我需要搜索 a 部分中提到的输出中的每一行。多于。为了说明,我想运行相当于:

grep 'aaa bbb' file-1 txt file-2.txt file-3 txt 
grep 'ccc ddd' file-1 txt file-2.txt file-3 txt
......
20,000 times
.......

但是上面的命令需要很多时间。

问题:

如何使用一系列命令来执行此操作。每当我运行命令时(如下所示),系统只搜索该行中的单个单词,即分别搜索 aaa 和 bbb 并给我错误的输出。

例如:

cat < filename > | cut -d "," -f1,2 | xargs -I {} sed '{}' file-1.txt

或者使用 grep 代替 sed....

注意:管道之前的命令将输出带入空间,如点 a 中所述。以上。

任何帮助将不胜感激。

【问题讨论】:

  • 将您的初始输出写入临时 file,然后使用 grep -f file... 从该文件加载搜索词。这将调用 grep once 并阻止调用 grep 20000 次。 (这会快很多:pgrep 是适合这项工作的工具,而不是sed
  • 要搜索的文件也按列组织?你想“加入”吗?
  • 如果你重复这样做,你可能会考虑sqlite - 甚至像PostGreSQL这样的真实数据库:要么调整创建这些文件的程序以写入Sqlite - 或Postgresql- 数据库,或者编写一个特定的程序或脚本来制作。

标签: linux sed grep


【解决方案1】:

将所有模式(aaa bbb 等)存储到文件(patterns.txt)中,每行一个,然后

grep -f patterns.txt file-*.txt

将完成这项工作。

【讨论】:

    【解决方案2】:

    扩展 Hin 的答案,您可以使用 bash 的进程替换在一行中生成模式并进行 grep 搜索:

    grep -F -f <(cut -d, -f1,2 filename) file-*.txt
    

    我假设您生成的模式是固定字符串,而不是正则表达式,因此 -F 选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2012-12-25
      • 2020-05-03
      • 2012-06-18
      相关资源
      最近更新 更多