从多个文件中抓取行的最快方法

时间:2016-06-15 12:08:37

标签: python unix parallel-processing grep

我的文件大小不一,有些文件很大。我有很多这些文件,都是用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)吗?

谢谢, [R

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

2 个答案:

答案 0 :(得分:4)

在搜索特定列中的文本时,

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的行。即使文件包含多个实例,所有实例也会附加到输出文件中。

答案 1 :(得分:1)

作为@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可以并行处理文件。