我正在尝试在Python的子进程中使用此awk命令,但不确定如何执行双管道。我宁愿不使用shell=True
,因为这是不好的做法。我已经能够合并其他awk命令,但是它们都不需要双管道。
awk 'FNR==NR{if($0~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)' file.txt file.txt
这将在最后一次出现的“名称”之后删除4行。这是我原来文件的内容:
name: file1
name: file2
name: file3
file4
file5
file6
在终端中运行此命令将返回:
name: file1
name: file2
name: file3
file4
file5
file6
我正在尝试使用python子进程从python文件中执行此操作,但我不确定该如何做。
这是我最初的方法:
import os
import sys
import subprocess as sb
sb.Popen('awk','FNR==NR{if($0~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)','file.txt','file.txt')
这是我得到的错误:
TypeError: bufsize must be an integer
在没有shell=True
的情况下如何做到这一点的任何帮助?
您需要将命令的参数放入列表([]
)中,否则它们最终将被分配给bufsize
,executable
等,而不是您希望将它们放在何处:
sb.Popen(['awk','FNR==NR{if($0~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)','file.txt','file.txt'])
与||
无关。