Обязательно ли иметь переменную в первом заявлении 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 

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.

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

  • Возможно ли запустить 10,04 или 12,04 или более ранние LTS в контейнерах под LXC или Docker on Trusty?
  • PHP не использует сокеты MySQL по умолчанию
  • Отображение контекстного меню с использованием сценария оболочки
  • Почему я не могу использовать ssh?
  • AMD APU Linux-дистрибутив
  • SSH, поврежденный при подключении к VPN при обновлении с Ubuntu 13.04 до 14.04
  • Почему logcheck сообщает о успешных входах в Орду?
  • Можно ли импортировать папку vmail из старого iRedMail в новую установку iRedMail?
  • Что делает параметр «i8042.nomux = 1» во время загрузки Ubuntu?
  • Проблема с установкой Chromium на libgl1-mesa-glx: i386
  • Не удается получить доступ к веб-серверу, но может ssh к нему
  • Linux и Unix - лучшая ОС в мире.