-3

从 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 )。

有没有更简单的方法来做到这一点?

4

1 回答 1

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

于 2014-06-10T17:21:54.963 回答