我的文件大小不一,有些文件很大。我有很多这些文件,都是用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'将始终聚集在文件的顶部)
答案 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可以并行处理文件。