本文介绍如何在python中完全替代shell中awk命令的功能,避免字符串拼接引发的格式错误与安全风险,通过内置csv模块安全解析竖线分隔文件,并动态插入变量生成目标字符串。
在将Bash脚本迁移到Python时,一个常见误区是试图用os.system()或subprocess拼接shell命令(如awk),尤其当需嵌入Python变量时,极易因引号嵌套、字符串格式化冲突(如%与$混用)导致TypeError: not all arguments converted during string formatting等错误——正如原始代码中cmd = '''...${%d}...''' %yy的语法混乱所体现的。
更可靠、更Pythonic的方式是完全在Python内部完成数据处理。针对以|为分隔符的文本文件(如master22.txt),推荐使用标准库csv模块,它专为结构化文本解析设计,能正确处理空格、引号及边界情况,远比手动split('|')健壮。
以下是优化后的完整实现:
import csv
def awkfst(inname, yy, outname):
# 修正原代码中的拼写错误:'innane' → 'inname'
with open(inname, 'r', newline='') as infile, \
open(outname, 'w') as outfile:
reader = csv.reader(infile, delimiter='|', skipinitialspace=True)
for row in reader:
# 确保行至少有4个字段(索引0~3),且第3列($4)存在;同时检查第2列($2)是否含'R1'
if
len(row) >= 4 and 'R1' in row[1]: # 注意:CSV索引从0开始,$2对应row[1]
# 拼接:yy值 + 第4字段(row[3])+ 字符串'XA',并换行
outfile.write(f'{yy}{row[3].strip()}XA\n')关键改进说明:
调用示例:
yy = 22
filename = f"master{yy}.txt" # 推荐f-string替代%格式化
outlistx = "listx"
awkfst(filename, yy, outlistx)注意事项:
坚持“用Python做Python的事”,不仅能规避字符串格式化陷阱,更能写出更安全、更易调试、更符合工程规范的代码。