use*_*169 -2 python bash awk subprocess sed
如何在不使用subprocess命令的情况下将以下内容转换为python
cat $MYDIR/* |grep ABCD |grep zip |grep -v idx |awk -F'/' '{print $3}' |awk -F"_" '{print $2}' |awk -F"." '{print $1}' |sed 's/\$[A-Z]//g' | sort|uniq |egrep -v "^ABCD_G9" |egrep -v ABCD_00 |egrep -v "^ABCD_0[1-8]" > $DATADIR/ABCDDataFile
Run Code Online (Sandbox Code Playgroud)
您"分解"管道,了解每个部分的作用,然后在Python中重新编码每个部分,并根据需要进行连接.那么,让我们看看......:
cat $MYDIR/* |
Run Code Online (Sandbox Code Playgroud)
此部分连接驻留在名称在环境变量中的目录中的所有文件MYDIR.所以这可能会被实施,例如(在适当的进口之后)
def p1():
filenames = glob.glob(os.environ['MYDIR'] +'/*')
for filename in filenames:
with open(filename) as f:
for line in f:
yield line
Run Code Online (Sandbox Code Playgroud)
使用生成器来模拟shell管道的缓冲同时性.
grep ABCD |
Run Code Online (Sandbox Code Playgroud)
此部分接受行,仅发出包含'ABCD'的行.所以举个例子
def grep(pattern, inseq):
for line in inseq:
if pattern in line: yield line
Run Code Online (Sandbox Code Playgroud)
并且类似地
grep zip |
Run Code Online (Sandbox Code Playgroud)
下一部分,
grep -v idx |
Run Code Online (Sandbox Code Playgroud)
只需要反转grep,所以:
def grepv(pattern, inseq):
for line in inseq:
if pattern not in line: yield line
Run Code Online (Sandbox Code Playgroud)
等等.翻译egrep并sed需要正则表达式,但在其他方面非常相似,所以我会把这些内容留给你; awk这里使用的只需要.split各种"字段分隔符"和结果列表的索引.
sort | uniq |
Run Code Online (Sandbox Code Playgroud)
实际上最好翻译成一个单件:
def sortuniq(inseq):
for line in sorted(set(inseq)): yield line
Run Code Online (Sandbox Code Playgroud)
(使用发电机与以前的情况一致).
所以,一旦你翻译了每一件作品,你就可以用你喜欢的方式连接它们.
连接的简单方法是通过函数调用,但这需要一些不太自然的顺序,最左边的部分("源" p1)成为深层嵌套调用的最内层参数.通过import this在交互式翻译提示下,我们学习其他智慧语言"扁平比嵌套更好".
有点花哨(functools.partial用于在必要时预先绑定前导args,因此只留下过滤器函数,就像inseq它们的参数一样)可以走很长的路......:
def pipeline(source, *filters):
curf = source
for f in reversed(filters):
curf = functools.partial(f, curf())
for line in curf():
yield line
Run Code Online (Sandbox Code Playgroud)
并将结果写入某个文件,
with open(whatever, 'v') as f:
f.writelines(
pipeline(
p1,
functools.partial(grep, 'ABCD'),
functools.partial(grep, 'zip'),
# etc, etc
Run Code Online (Sandbox Code Playgroud)
我会以这种方式编码吗?很可能不会 - 我会对整个管道试图做的事情进行反向工程,而不是一步一步地将它们全部连接起来.虽然Python是一种灵活的多范式语言,但使用它来严格模拟shell典型的管道方法并不是最佳操作.然而,它可能非常有启发性,这就是为什么我花了一些时间在这里展示它!
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |