Обязательно ли иметь переменную в первом заявлении awk?

Сегодня мне сложно с awk. Если я попытаюсь сделать:

df|awk '{print $2; $some=$2; print $some}' 

Он работает так, как ожидалось, и я получаю размер дисков дважды, но если я это сделаю:

 df|awk '{$some=$2; print $some}' 

Я просто получаю пустые строки. Почему это происходит? Что-то может быть неправильно в моем понимании, но почему использование поля обязательно для последующих полей? Я также пытался сделать:

 df|awk '{print "hello"; $some=$2; print $some}' 

и у меня есть «привет», каждый из которых разделен новой строкой. Где потеряно $ some = $ 2?

Мои выходные команды df :

 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda5 38448788 32098732 4396932 88% / udev 1914564 4 1914560 1% /dev tmpfs 768744 984 767760 1% /run 

  • Проблемы с DHCP Virtualbox
  • Как написать условный оператор if в скрипте оболочки bash?
  • Инструмент для сжатия / распаковки STDIN
  • Почему ошибка загрузки с моим настраиваемым ядром на этапе mknod?
  • Найти исходные файлы для OpenGL на хосте
  • Kworker на 100% - я думаю, что все пробовал!
  • Как связать arduino как фиксированное блок-устройство - / dev / ttyACM0?
  • Параллельно вызвана эта «ошибка mustOpen: не удается открыть - читать: нет такого файла или каталога»
  • 3 Solutions collect form web for “Обязательно ли иметь переменную в первом заявлении awk?”

    Вы не должны использовать $ -sign перед some . Случается, что с вашей первой командой $2 печатается, а затем $some=$2 переводится в $0=$2 поскольку some являются униализированными (в некоторых реализациях awk some из них преобразуются из "" в 0 , а не все (тогда вы получаете сообщение об ошибке) ), поэтому вы заменяете запись ( $0 ) на $2 . Затем вы печатаете $some , что означает $0 Таким образом, он идентичен

     df|awk '{print $2; $0=$2; print $0}' 

    а также

     df|awk '{$0=$2; print $0}' 

    То, что вы, вероятно, хотели сделать, это:

     df|awk '{print $2; some=$2; print some}' 

    Я получаю ожидаемый результат. Первая команда печатает каждый элемент дважды. Вторая команда печатает его один раз.

    Это довольно нетрадиционно – «some» будет иметь значение нуля по умолчанию, поскольку оно не определено. $ some, поэтому $ 0, который представляет всю строку, поэтому в основном вы заменяете строку тем, что вы находите в $ 2, когда используете $some=$2

    Сравните это с этим результатом:

     johan@computer:~$ df|awk '{$some=$2; print}' 1K-blocks 30827524 4041028 1621692 5120 4054228 102400 4054228 60555340 209548784 

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

    В Solaris у меня есть доступ к «стандартному» awk, а также, предположительно, совместимой с POSIX версии, установленной в / usr / xpg4 / bin / awk. Оба они дают одинаковый результат для следующих

    Они производят разные результаты в зависимости от того, добавляю ли я перед собой «печать приветствия» или нет, и в зависимости от того, заменяю ли я последнюю команду «печатью» (вместо печати $ some) или нет.

    Все они печатают ЧТО-ТО, а не пробелы, хотя – мне не удалось найти версию, которая воспроизводит этот эффект.

    Поэтому я ожидаю, что это будет какое-то неопределенное поведение из-за использования неинициализированной переменной – вы назначаете значение столбцу, который потенциально далеко заходит до конца возможного диапазона столбцов во входном потоке. $ some относится к столбцу, идентифицированному значением "some"

    Вы должны просто использовать «some» как переменную, например

     df | awk '{print "hello";some=$2; print some}' 

    Я думаю, причина в том, что Ubuntu не использует стандартную имплантацию GNU, а что-то еще известное как mawk, которое разбивает много кода, который работал под стандартным unix.

    Пожалуйста, обратитесь к этой ссылке для аналогичного обсуждения.

    Linux и Unix - лучшая ОС в мире.