Я пытаюсь awk
изменить некоторые текстовые файлы, используя этот код.
awk -F":" '/^title/ { o=FNR+2 } ;FNR>o { print sprintf("%-10s %-10d %-10s",FILENAME,o,$0) }' r.txt
но это не сработало, пока я не заменил условие следующим образом FNR>5
.
Так что я много пробовал здесь, но я не нашел решения. Я поставил "FNR>o"
&, FNR>$o
но ничего.
Ребята, кто-нибудь может мне помочь? Вход:
date: 22.01.2020
name : xrgsm02
title : RCV20
----------------
----------------
15 20
30 40
50 12
55 77
выход
r.txt 5 15 20
r.txt 5 30 40
r.txt 5 50 12
r.txt 5 55 77
решение1
Проблема:
FNR>o
- Использование
>
оператора с неинициализированным значением- Пока
o
он не инициализирован, он имеет числовое значение0
и строковое значение пустой строки. - В вашем скрипте
o
устанавливается с помощью/^title/ { o=FNR+2 }
, но/^title/
не появляется до третьей записи. Так что для первых двух записейo
неинициализирован иFNR>o
оценивается какtrue
(потому чтоFNR==1
&FNR==2
являютсяgreater than zero
)
- Пока
Возможное решение:
o && FNR>o
- Укажите, что
o
должно быть ненулевым, в дополнение кFNR>o
Кроме того, это несколько сбивает с толку, поскольку имя переменной состоит из одной буквы — рассмотрите возможность использования вместо этого o
буквы, например, n
или более описательного слова, например.output
print sprintf("%-10s %-10d %-10s",FILENAME,o,$0)
можно упростить до:
printf("%-10s %-10d %-10s\n",FILENAME,o,$0)
или даже:
printf "%-10s %-10d %-10s\n",FILENAME,o,$0