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

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

  • Команда не найдена при запуске скрипта в качестве другого пользователя
  • Проблемы с установкой Ruby без sudo
  • Автоматическое обновление списка NAS в FreeRADIUS?
  • UDev автоматизирует диски как «usbhd», независимо от типа и имени на Ubuntu 12.10
  • Как установить AMD Catalyst 15.9 на Ubuntu 15.10?
  • Как получить информацию о том, какой сервер отображения работает?
  • Списки команд ls скрывают файлы
  • Регистрация клиента Ubuntu с помощью Spacewalk
  • Nautilus Renaming Bug при нажатии клавиши «n» в Ubuntu
  • Поддержка rsyslog и netsnmp для пространств имен Linux
  • Ошибка при загрузке Ubuntu 14.04 - setterm: $ TERM не определен
  • Interesting Posts

    Как настроить сервер для использования сети IPv6

    Установить шрифт Ubuntu в других операционных системах?

    Разница между Solaris и OpenSolaris?

    Имеет ли структура данных inode фактический адрес файла на диске?

    Скромная установка на WIN 7 без прав администратора

    Полнотекстовый поиск справочных страниц

    Подробное профилирование для каждого процесса

    Командная строка Photo Organizer Как и Shotwell, но для запуска на безголовом сервере

    Хостинг нескольких веб-сайтов в Webmin

    Как прекратить получать спам-сообщения с сервера

    sed удалить ze, если ze один в строке

    Равномерно распределять ресурсы по нескольким направлениям

    Почему хеш-символ Gedit расширен и интерпретируется неправильно в интернет-браузерах?

    Моя клавиатура продолжает пробуждать компьютер, даже когда все отключено в / proc / acpi / wakeup. Как я могу остановить это от этого?

    Grep огромное количество шаблонов из огромного файла

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