我有一个包含 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 文件并调用这两个脚本,但是,在我的打印测试中,没有发生修改。
任何人都可以解释一下我在哪一点上犯了错误吗?
最佳答案
编写脚本最简单的方法是编写单独的行,甚至只是部分行,运行、测试,确保它能正常工作,然后继续下一部分。这样,您一次只需解决几个问题。
您选择了最困难的方法:编写整个脚本,然后尝试解决所有问题。这意味着您必须同时考虑以下所有问题,因为每个问题都是一个完整的问题:
- 您的第一个 awk 命令在语法上是无效的,因为您试图将单引号嵌套在单引号中,而没有引用或转义它们。
- 您的第二个 awk 命令在语法上无效,因为它缺少
- awk 命令都不输出任何内容
- 您将
row
指定为awk
的文件名,即使这是 Python 列表而不是文件 - 您永远不会从
awk
读取或写入任何 Python 数据 - 即使您这样做了,
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/