awk: работа с переменной в операторе if - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь понять, как awk работает с переменными в if операторах.

Вот текстовый файл игрушки:

$ cat myscript.sh 
#! /bin/bash

set -eu
set -o pipefail

IFS=$'\n\t'

for arg in $@; do
    echo "do something with file $arg"
done

Теперь я хочу awk напечатать самую длинную строку в файле. Я думал сделать это:

$  awk '{max = 0}{if (length($0) > max) {max = length($0)} else {}} END {print max}' myscript.sh 

Но это печать длины последней строки. Однако, когда я запускаю следующее:

awk '{if (length($0) > max) {max = length($0)} else {}}END{print max}' myscript.sh 

Результат верен и печатает правильную длину 35.

Я не могу понять, почему, когда я задаю переменную max перед оператором if, условие не распознается. Я уверен, что для awk-gurus есть простое объяснение, но лично я его не вижу.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

@ Корентин уже объяснил вашу проблему, поэтому вы должны оставить его / ее ответ как принятый, но только для вашего правильного способа вывести длину самой длинной строки в файле:

awk '{cur=length()} cur>max{max=cur} END{print max+0}' myscript.sh

Это гарантируетmax будет числом, даже если все строки пусты, не будет вызывать length () несколько раз на строку и гарантирует, что вы получите числовой вывод, даже если ввод пуст (как wc для пустых файлов).

0 голосов
/ 28 мая 2019

Вы можете немного изменить первую команду, чтобы она заработала:

awk 'BEGIN{max = 0}{if (length($0) > max) {max = length($0)} else {}} END {print max}' myscript.sh 

Таким образом, вы инициализируете переменную max в начале скрипта.Без оператора BEGIN значение max обновляется до 0 в каждой строке.

Однако переменные awk имеют значения по умолчанию, которые зависят от контекста.Вы можете прочитать this , чтобы понять логику.

Переменным в awk могут быть присвоены либо числовые, либо строковые значения.Тип значения, которое содержит переменная, может меняться в течение жизни программы.По умолчанию переменные инициализируются в пустую строку, которая равна нулю при преобразовании в число.

С помощью этой команды:

awk '{if (length($0) > max) {max = length($0)} else {}}END{print max}' myscript.sh 

Awk инициализирует максимум до 0 припервая строка, потому что вы сравниваете ее с длиной ($ 0), которая является целым числом.

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