Команда печати awk с условием NR > var

Команда печати awk с условием NR > var

Я пытаюсь 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

Связанный контент