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

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

  • найти причину повреждения файла при копировании файлов на сетевой ресурс на машине Ubuntu
  • Команда du показывает косую черту после каталогов?
  • Установите параметр поворота «-x» для запуска NTP
  • Неустранимая ошибка: mcrypt.h: Нет такого файла или каталога
  • Поддерживается ли Уби?
  • Почему у меня нет файла httpd.conf в / etc / apache2?
  • Установка Pagespeed + Nginx из источника не выполняется
  • Ключ к букве «o» перестает работать, работает только с Shift, Linux
  • Причины для rsync НЕ переносить все файлы?
  • pam-auth-update не отображает экран подсказки или не регистрирует никаких сбоев
  • Как правильно настроить яркость монитора во время загрузки?
  • Зашифровывает ли все мои медленные программы Lubuntu?
  • Linux и Unix - лучшая ОС в мире.