Определение NR в разделе BEGIN скрипта awk - PullRequest
0 голосов
/ 08 февраля 2019

Прежде чем awk обработает входной файл, мне нужно знать, сколько записей ожидать.

Чтобы определить это, у меня есть следующий код в сегменте BEGIN моего скрипта awk ....

BEGIN {

    p = ""
    j = 1

    getline             # Activates the FILENAmE variable which normally is not available in the BEGIN section of an awk script.
    n = system("wc -l " FILENAME)       # Assign the result (i.e. number of records in FILENAME) to the n variable.
    gsub(FILENAME, "|", n)      # Remove the input file name appended to the result and replace with "|" just to see what it's done!  
    print n             # See what the hell has happened.

}

Я надеюсь увидеть n, показывающее количество записей, но мой вывод выглядит следующим образом ....

12 accounts12
0

"accounts12" - это имя моего входного файла....

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

Самый эффективный и лаконичный способ сделать это, учитывая, что ваш ввод всегда является файлом, а не потоком, это просто вызвать wc вне скрипта и использовать его вывод внутри него:

awk -v nr="$(wc -l < file)" '{print nr, NR, $0}' file

например:

$ seq 3 > file
$ awk -v nr="$(wc -l < file)" '{print nr, NR, $0}' file
3 1 1
3 2 2
3 3 3
0 голосов
/ 08 февраля 2019

Вы также можете сделать это

$ awk 'NR==FNR{n=NR; next} FNR==1{print n} ...' file{,}

. В первом раунде вычисляется количество записей, во втором раунде выводится счетчик и выполняется остальная часть обработки.

0 голосов
/ 08 февраля 2019

Другой способ с awk:

  • Установить FS на \ n (каждая строка - поле)
  • Установить RS на \ 0 (только одна запись)
  • Работа с полями

    awk -F '\ n' -vRS = '\ 0' '
    {
    print NF
    для (i = 1; i j = split ($ i, a, "")
    print "nb of fields =" j
    }
    } 'infile

0 голосов
/ 08 февраля 2019

system возвращает статус выхода (обычно 0, если он успешно завершен).Таким образом, строка:

n = system("wc -l " FILENAME)

будет просто приводить к выводу команды wc, которая будет напечатана на экране, как обычно, а затем для n будет задан код выхода 0.

Это объясняет:

12 accounts12
0

Первая строка - это вывод wc, вторая - значение n.

Вы можете попробовать вместо этого:

BEGIN {
    "wc -l " ARGV[1] | getline n;
    sub(ARGV[1], "|", n);
    print n;
}

Это должно получить ваш n.Преимущество в том, что он не будет занимать первую строку вашего файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...