我正在编写一个脚本,可以从与正则表达式匹配的文本文件中grep行和列。我有一个实现,但我希望它更优雅。
这是我的input.tsv:
a b c d
a 2 9 6 1
b 6 4 7 0
c 3 7 2 0
d 5 8 2 2
我想做这样的事情:
$ grep-row-column.py -E "[a|c]" input.tsv
a c
a 2 6
c 3 2
解决方案应该能够流式传输文件(即不将整个内容读入内存)。
这是我的解决方案,有效。
from __future__ import print_function
import sys,re
filename="input.tsv"
regex="[a|c]"
prog=re.compile(".*"+regex+".*")
with open(filename) as tsv:
#find the appropriate columns in the header that match the regex
line=tsv.readline()
header=line.split("\t")
count=0
cols=[]
print(header[0], end='')
for token in header:
if prog.match(token):
#add the column indices to a list for use later
cols.append(count)
print("\t",token, end='')
count+=1
print()
#in the rest of the line, find the matching rows and
#print the columns that match the indices found above
while line!="":
line=tsv.readline()
if line.strip()=="":
continue
tokens=line.split()
if prog.match(tokens[0]):
print(tokens[0], end='')
for col in cols:
print("\t",tokens[col], end='')
print()
还有更多' python'这样做的方法?我无法弄清楚如何避免所有for循环和if语句。提前感谢任何建议。