символ \n
в команде не передается awk
как \n
, но как перевод строки в командной строке.
Вам необходимо использовать префикс raw, чтобы \n
передавался буквально:
cmd = r'''awk '{printf "%.6f %.6f %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
(и да, благодаря прочтению другого ответа Гленна , я увидел, что забыл удвоить символ %
, так что на самом деле это не очень удобное решение, если вы не используете format
вместо этого, исправление только частичный)
с использованием str.format
и двойных кавычек (здесь нет необходимости в тройных одинарных кавычках):
cmd = r"awk '{printf "%.6f %.6f %.6f\n",$1-10.0,$2,$3}' {}.txt > {}.txt".format(file_name_1, file_name_2)
Еще лучше, переписать это на чистом питоне, используя open
, str.split
для повторяющихся строк и преобразования с плавающей запятой. Не проверено, но должно отлично работать:
with open(file_name_1+".txt") as fr, open(file_name_2+".txt","w") as fw:
for line in fr:
toks = [float(x) for x in line.split()]
fw.write("%.6f %.6f %.6f\n" % (toks[0]-10,toks[1],toks[2]))
- более портативный (не нужно
awk
, например, в Windows)
- если в именах файлов есть пробелы, это не проблема
- избегает системного вызова