Python 从多个文件中获取行的最快方法
我有大小不一的文件,有些很大。我有很多这样的文件,都是用lzop压缩的 这些文件如下所示:Python 从多个文件中获取行的最快方法,python,unix,parallel-processing,grep,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,
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'
我想抓住所有在第二列中有C的行-一个带“,”C”的grep就可以了。我怎样才能加快速度
我要查找的行将始终位于文件的顶部-但是行数可能会有所不同(不应超过20行)。文件是有序的,因此,只要带有“、C”的行后面的行与正则表达式不匹配,文件中就不再有“、C”
我应该在这里研究并行grep吗(我可以访问具有许多内核的HPC)
谢谢,
R
编辑:
在同一个文件中可以有多个匹配项(并且包含“C”的行将始终聚集在文件的顶部)
grep
在搜索特定列中的文本时可能无效,但awk
正是在实现这一点上取得了成功
如果您希望处理多个文件,并且最多只能有一行包含列值为C
的second
行,那么下面的脚本就足够了
# 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使用awk进行匹配的答案的补充,如果您有许多文件,一个有用的扩展可能是使用“make”实现轻松(本地)并行,或者匹配某些文件可能需要很长时间:
inputs = $(wildcard *.txt)
outputs = $(inputs:.txt=.matches)
%.matches : %.txt
./findmatches.sh $< > $@
matches.all: $(outputs)
cat $(outputs) > matches.all
all: matches.all
inputs=$(通配符*.txt)
输出=$(输入:.txt=.matches)
%.matches:%.txt
./findmatches.sh$<>$@
matches.all:$(输出)
cat$(输出)>匹配.all
全部:全部
在
Makefile
中,然后使用make-j8
或类似工具,以便make可以并行处理文件。如果您确定这20行,是否尝试过使用head?文件中不能有多行第2列包含“C”?很抱歉在iAn中没有明确说明,谢谢您的回答。但是,一个文件中可以有多个匹配项。@user1338194:这不是问题,更新的答案会解决问题that@user1338194:很乐意帮忙!很长一段时间没有在愤怒中使用awk,但我认为,“{if($2==“C”){matched=1;print;}否则{if(matched)exit;}}'$I”将在输出第一次“运行”匹配后停止。可能需要比我确定的更多的测试。谢谢你的回答。我是Make的新手。我不确定我是否完全理解如何使用上述内容。这启发了我花时间去了解这一点。谢谢。我发现倒读会更容易。在这种情况下:all
需要匹配。所有的都要进行<代码>匹配。所有
需要所有*.matches文件。。。模式规则实际上是从每个foo.txt
生成foo.matches
。并行性技巧是make知道它可以应用模式规则来生成*.matches文件,可以为每个文件独立完成,因此可以并行运行其中几个文件。