以下命令从shell执行时工作正常。我想在python脚本中做同样的事情(或者更确切地说,得到相同的输出)。但无论我做什么,我总会得到一些引号错误。我试过用os.system ...,subprocess.Popen ...,shlex.split来实现这个......没有运气。
comm -13 <(grep -e 77772 -e 77778 -e 777710 myfile1.dat |
awk 'BEGIN {FS=";"} ; {print $8 "," $1}' |
sort -t '.' -k 1,1 -k 2,2) \
<(grep -e 77772 -e 77778 -e 777710 myfile2.dat |
awk 'BEGIN {FS=";"} ; {print $8 "," $1}' |
sort -t '.' -k 1,1 -k 2,2) |
tee output.dat
(我基本上从包含77772或77778或777710的两个文件中选择行,从这些行中选择两列(column1和column8),对它们进行排序以查找myfile2.dat独有的行 - 并将这些行写入output.dat)。
有更简单的方法吗?
答案 0 :(得分:1)
实际问题很容易回答
subprocess.call(['bash', '-c',
'''comm -13 '''
''' <(grep -e 77772 -e 77778 -e 777710 myfile1.dat | '''
''' awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | '''
''' sort -t '.' -k 1,1 -k 2,2) '''
''' <(grep -e 77772 -e 77778 -e 777710 myfile2.dat | '''
''' awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | '''
''' sort -t '.' -k 1,1 -k 2,2) '''
''' | tee output.dat'''],
)
这会将整个管道作为单个字符串传递给bash
的实例。 (它使用隐式连接相邻字符串以便于阅读。
但是,我建议完全用Python实现它,而不是分支多个进程。将myfile1.dat
中的相关数据读入内存(假设它不是太大),进程从myfile2.dat
一次一行,如果在数据中找不到其字段,则输出该行你是从myfile1.dat
读到的。