【问题标题】:Quickest way to grab lines from multiple Files从多个文件中获取行的最快方法
【发布时间】:2016-06-15 12:08:36
【问题描述】:

我的文件大小不一,有些很大。我有很多这些文件,都是用 lzop 压缩的。

文件如下所示:

nodedef>name VARCHAR,family VARCHAR,composite VARCHAR,color VARCHAR
1104283,C,1,'238,32,77' 0,1,4,'255,182,83' 1,1,4,'255,182,83'
7,1,4,'255,182,83' 11,1,4,'255,182,83' 12,1,4,'255,182,83'
13,1,4,'255,182,83' 14,1,4,'255,182,83'

我想抓取第二个 Col 中所有带有 C 的行 - 带有“,C”的 grep 将执行此操作。我怎样才能加快速度?

我要查找的行将始终位于文件的顶部 - 但是行数可能会有所不同(不应超过 20 行)。该文件是有序的,因此只要带有“,C”的行与正则表达式不匹配,文件中就没有更多的“,C”。

我是否应该在这里查看并行化 grep(我可以访问具有多个内核的 HPC)?

谢谢, 回复

编辑: 同一个文件中可以有多个匹配项(并且包含“C”的行将始终聚集在文件顶部)

【问题讨论】:

  • 如果您确定这 20 行,您是否尝试过使用 head ?
  • 文件中第二列包含“C”的文件不能超过一行?

标签: python unix parallel-processing grep


【解决方案1】:

grep 在搜索特定列中的文本时可能效果不佳,但 awk 在实现这一点方面做得很好。

如果您要处理多个文件,并且不能超过一行包含 2nd 列值为 C 的行,则以下脚本就足够了。

# Am assuming the the `.txt` files are the ones you want to process

for i in *.txt; do
    [ -e "$i" ] || continue    # To handle when no input *.txt files present
    awk -F',' '$2 ~ /C/ { print }' "$i" >> MatchingLines.txt
done

我正在创建一个新文件MatchingLines.txt,其内容将在您拥有的每个文件中附加包含C 的行。即使文件包含多个实例,它们也会全部附加到输出文件中。

【讨论】:

  • 抱歉没有说清楚Inian,谢谢你的回答。但是,一个文件中可以有多个匹配项。
  • @user1338194:这不是问题,更新的答案会解决这个问题
  • @user1338194:乐于助人!
  • 很长一段时间没有在愤怒中使用awk,但我认为awk -F',' '{if($2=="C"){matched=1;print;}else{if(matched)exit;}}' "$i"会在输出第一次“运行”匹配后停止。可能需要比我确定的更多地测试它。
【解决方案2】:

作为对@Inian 使用 awk 进行匹配的回答的补充,如果您有很多文件,或者在某些文件上匹配可能需要很长时间,一个有用的扩展可能是使用“make”来实现简单的(本地)并行性-时间:

inputs = $(wildcard *.txt)
outputs = $(inputs:.txt=.matches)

%.matches : %.txt
    ./findmatches.sh $< > $@

matches.all: $(outputs)
    cat $(outputs) > matches.all

all: matches.all

在Makefile 中,然后使用make -j8 或类似的,以便make 可以并行处理文件。

【讨论】:

  • 感谢您的回答。我是Make的新手。我不确定我是否完全理解如何使用上述内容。这激发了我花时间学习这一点。谢谢。
  • 我发现向后阅读它们会更容易。在这种情况下:all 需要生成 matches.all...matches.all 需要生成所有 *.matches 文件...而模式规则实际上是从每个 foo.txt 生成 foo.matches。并行技巧是 make 知道它可以应用模式规则来制作 *.matches 文件可以为每个文件独立完成,因此可以并行运行其中的几个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多