【问题标题】:awk commands within python scriptpython脚本中的awk命令
【发布时间】:2013-05-16 12:39:44
【问题描述】:

我需要编写一个 python 脚本,我需要在其中调用一些 awk 命令。

#!/usr/bin/python
import os, sys
input_dir = '/home/abc/data'

os.chdir(input_dir)
#wd=os.getcwd()
#print wd
os.system ("tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c")

第 8 行报错:SyntaxError: unexpected character after line continuation character

有没有办法让 awk 命令在 python 脚本中工作? 谢谢

【问题讨论】:

  • 转义 \t 周围的引号?
  • 为什么? sed/awk/sort/uniq 没有什么是你不能直接在 python 中做的,作为奖励,你得到了一个可以在所有平台上运行 python 移植到的解决方案!

标签: python awk


【解决方案1】:

您应该使用subprocess 而不是os.system

import subprocess
COMMAND = "tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS=\"\t\"};{split($10,arr,\"-\")}{print arr[1]}'|sort|uniq -c"  

subprocess.call(COMMAND, shell=True)

正如 TehTris 所指出的,问题中引号的排列将命令字符串分成多个字符串。预先格式化命令并转义双引号可以解决此问题。

【讨论】:

  • 向管道添加更多|cats 会更好,不是吗?
  • 他为什么要用subprocess而不是os.system?谢谢。
【解决方案2】:

你在那个字符串中有两种类型的引号,所以在整个内容中使用三引号

>>> x = '''tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c'''
>>> x
'tail -n+2 ./*/*.tsv|cat|awk \'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}\'|sort|uniq -c'

【讨论】:

  • 堆栈溢出在code 块中的格式不正确,但是如果您将该行复制粘贴到解释器中,您就会明白我的意思。
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
相关资源
最近更新 更多