在python脚本中循环执行awk

2024-05-16 23:11:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含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)

简而言之:我要执行的每个命令都存储在两个变量中:strand\u signature和strand\u correction。所以我逐行读取csv文件并调用这两个脚本,但是在打印测试中,修改不会发生。你知道吗

有人能解释一下我犯了什么错误吗?你知道吗


Tags: 文件csvimport命令脚本ifreaderfile
1条回答
网友
1楼 · 发布于 2024-05-16 23:11:49

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

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

  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)

相关问题 更多 >