在python 3.6子流程中运行awk日期转换

在python 3.6子流程中运行awk日期转换,python,awk,subprocess,Python,Awk,Subprocess,我正在尝试将下面的awk行写入python awk -F, '{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}' counts.csv > counts_epoch.csv v1 这将返回: subprocess.Popen(["awk", "'{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s

我正在尝试将下面的awk行写入python

awk -F, '{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}' counts.csv > counts_epoch.csv 
v1

这将返回:

    subprocess.Popen(["awk", "'{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}'", 'counts.csv'], stdout=f)
                                    ^
SyntaxError: invalid syntax
v2:

返回:

awk: cmd. line:1: {cmd="date -d ""$2"" +%s"; cmd | getline date; printf ("%s,%d,%d
awk: cmd. line:1:                                                            ^ unterminated string
awk: cmd. line:1: {cmd="date -d ""$2"" +%s"; cmd | getline date; printf ("%s,%d,%d
awk: cmd. line:1:                                                            ^ syntax error

有什么建议吗?谢谢

对于这些情况,我的技巧是复制确切的命令,使用三重引号引用其中的所有引号,使用
r
前缀获取原始字符串,然后使用
shlex.split
像shell一样拆分参数:

import shlex
cmdline = r"""awk -F, '{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}' counts.csv"""
cmd = shlex.split(cmdline)
然后你可以做你的事情:

with open("counts_epoch.csv", 'wb') as f:
    subprocess.Popen(cmd, stdout=f)

警告:Tbh我还没有测试我刚刚粘贴在这里的代码,但它应该可以工作。=)

尝试在外部添加三重引号
”,为什么不使用python本机日期/时间操纵函数/库?不需要所有这些复杂的东西。如果要将其标记为“python”“,使用python。嘿,各位,请停止删除问题的合法化!即使我自己也会考虑在这样的情况下使用纯Python,但它并没有使这个问题变得更不有效。有很多合理的理由可以解释为什么有人想这么做。从python中,您调用awk来调用shell来调用date?似乎有一种更简单的方法……从awk调用date的正确代码应该是
cmd=“date-d\047$2\047+\047%s\047”;日期=((cmd | getline)>0?行:-1);关闭(cmd);printf“%s,%d,%d\n”、$1、日期、$3
。请参阅和google shell引用规则。idk关于用python包装它。谢谢!它确实有用!一个简短的问题:引用的数量应该与某物相同?或者3只是这里的神奇数字@elias@Chubaka是的,三重引号是多行字符串的Python语法:
import shlex
cmdline = r"""awk -F, '{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}' counts.csv"""
cmd = shlex.split(cmdline)
with open("counts_epoch.csv", 'wb') as f:
    subprocess.Popen(cmd, stdout=f)