Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多个文件中获取行的最快方法_Python_Unix_Parallel Processing_Grep - Fatal编程技术网

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

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,

我有大小不一的文件,有些很大。我有很多这样的文件,都是用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'
我想抓住所有在第二列中有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文件,可以为每个文件独立完成,因此可以并行运行其中几个文件。