2

我正在尝试使用铅在 python 中执行以下命令:

sort -u -f -t$'\t' -k1,1 file1 > file2

但是,我在通过-t$'\t'论点时遇到问题。这是我的代码:

from plumbum.cmd import sort
separator = r"-t$'\t'"
print separator
cmd = (sort["-u", "-f", separator, "-k1,1", "file1"]) > "file2"
print cmd
print cmd()

我可以立即看到问题print separatorprint cmd()执行:

-t$'\t'
/usr/bin/sort -u -f "-t\$'\\t'" -k1,1 file1 > file2
  1. 参数用双引号括起来。
  2. 在 $ 和 \t 之前插入一个额外的 \。

我应该如何将这个论点传递给铅?

4

1 回答 1

1

您可能偶然发现了命令行转义的限制。

我可以使用模块使其工作subprocess,并逐字传递一个真正的制表符:

import subprocess

p=subprocess.Popen(["sort","-u","-f","-t\t","-k1,1","file1",">","file2"],shell=True)
p.wait()

此外,完整的 python 简短解决方案可以满足您的需求:

with open("file1") as fr, open("file2","w") as fw:
    fw.writelines(sorted(set(fr),key=lambda x : x.split("\t")[0]))

sort完整的 python 解决方案在处理 unicity 时的工作方式并不完全相同。如果 2 行具有相同的第一个字段但不具有相同的第二个字段,sort则保留其中一个,而set将保留两个。

编辑:未选中,但您刚刚确认它有效:只需调整您的铅代码:

separator = "-t\t"

可以正常工作,尽管在这 3 个中,我建议使用完整的 python 解决方案,因为它不涉及外部进程,因此更具 pythonic 和可移植性。

于 2016-12-25T17:18:34.530 回答