【问题标题】:run awk date conversion in python 3.6 subprocess在 python 3.6 子进程中运行 awk 日期转换
【发布时间】:2019-01-15 11:24:29
【问题描述】:

我正在尝试将以下 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

import subprocess

with open("counts_epoch.csv", 'wb') as f:
    subprocess.Popen(["awk", "'{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}'", 'counts.csv'], stdout=f)

这将返回:

    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:

with open("counts_epoch.csv", 'wb') as f:
    subprocess.call(["awk", '{cmd="date -d \""$2"\" +%s"; cmd | getline date; printf ("%s,%d,%d\n",$1,date,$3)}', 'counts.csv'], stdout=f)

返回:

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

有什么建议吗?谢谢!

【问题讨论】:

  • 尝试在外部加上三引号"""
  • 为什么不想使用 python 原生日期/时间操作函数/库?
  • 不需要所有这些复杂的东西。如果要标记此“python”,请使用 python。
  • 嘿伙计们,请停止使问题合法化!即使我自己也会考虑在这种情况下使用纯 Python,但这并没有使这个问题变得不那么有效。有很多正当理由可以说明为什么有人要这样做。
  • 从python你调用awk调用shell调用日期?似乎必须有一种更简单的方法....

标签: python awk subprocess


【解决方案1】:

对于这些情况,我的技巧是使用三引号复制确切的命令以引用其中的所有引号,前缀 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)

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

【讨论】:

  • 从 awk 调用日期的正确代码是 cmd="date -d \047$2\047 +\047%s\047"; date=((cmd | getline line) > 0 ? line : -1); close(cmd); printf "%s,%d,%d\n",$1,date,$3。请参阅 awk.freeshell.org/AllAboutGetline 和 google shell 引用规则。 idk 关于将其包装在 python 中。
  • 谢谢!它确实有效!一个快速的问题:引号的数量应该与某事相同吗?或者 3 只是这里的神奇数字? @elias
  • @Chubaka 是的,三引号是多行字符串的 Python 语法:stackoverflow.com/questions/10660435/…
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多