Python中的OS命令

时间:2014-06-10 16:55:37

标签: python pipe comm

以下命令从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)。

有更简单的方法吗?

1 个答案:

答案 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读到的。