python - 在 Python 脚本中循环执行 awk

标签 python linux csv awk

我有一个包含 15 列的表格文件,我想为该文件的每一行循环执行 2 个 awk 命令(我在 python 脚本中创建了很多其他函数,所以这些 awk 命令应该在我的脚本中。)

#!/usr/bin/python3

import subprocess
import csv


strand_signature = "awk '{if($10 > $11) {$16='-'}; else {$16='+'}}' row"
strand_correction = "awk '{n1=$10;n2=$11;if($10 > $11) {$10=n2; $11=n1}' row"


with open('my_file.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='\t')
    for row in csv_reader:
        subprocess.call(strand_signature, shell=True)
        subprocess.call(strand_correction, shell=True)
        print(row)

简而言之:我要执行的每个命令都存储在 2 个变量中:strand_signature 和 strand_correction。因此,我逐行读取我的 csv 文件并调用这两个脚本,但是,在我的打印测试中,没有发生修改。

任何人都可以解释一下我在哪一点上犯了错误吗?

最佳答案

编写脚本最简单的方法是编写单独的行,甚至只是部分行,运行、测试,确保它能正常工作,然后继续下一部分。这样,您一次只需解决几个问题。

您选择了最困难的方法:编写整个脚本,然后尝试解决所有问题。这意味着您必须同时考虑以下所有问题,因为每个问题都是一个完整的问题:

  1. 您的第一个 awk 命令在语法上是无效的,因为您试图将单引号嵌套在单引号中,而没有引用或转义它们。
  2. 您的第二个 awk 命令在语法上无效,因为它缺少
  3. awk 命令都不输出任何内容
  4. 您将 row 指定为 awk 的文件名,即使这是 Python 列表而不是文件
  5. 您永远不会从 awk 读取或写入任何 Python 数据
  6. 即使您这样做了,awk 也是基于行的,而不是基于 Python 列表的,因此您必须相应地加入和拆分

最好的选择是抛弃所有的 awk 并改用 Python。这在编写和运行时更容易、更健壮且速度更快:

with open('my_file.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='\t')
    for row in csv_reader:
        if float(row[9]) > float(row[10]):
            row[15] = "-"
        else:
            row[15] = "+"
        # ...
        print(row)

关于python - 在 Python 脚本中循环执行 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57151943/

相关文章:

python - 如何在使用 python 调度模块与共享作业队列并行执行作业时传递参数

python - 在 python3 中 : strange behaviour of list(iterables)

python - 引用被 Python 中的 pickling 弄乱了

linux - 快速查找具有给定 glob 的所有目录的方法

linux - Docker 守护进程在启动后不久就被杀死

java - 编辑 java jdk 的替代项时权限被拒绝

ms-access - 将csv文件导入access的VBA程序

python - 在 Google Docs API Python 中插入表格

python - 查看非常大的 CSV 文件的一部分?

python - 如何在 Python 中写入 csv 函数中的 float 转换字符串输出?