Действительно ли это обязательно, чтобы иметь переменную в первом операторе awk?

Я могу только предложить, Вы используете rsync. Это - своего рода промышленный стандарт, когда движущиеся файлы по безопасным соединениям.

rsync -alPvz ./source_dir server.com:destination_dir

Это - то, что я использовал в течение многих лет к настоящему времени.

( -a опция заботится о вещах как рекурсия каталога),

0
08.03.2013, 13:24
3 ответа

Вы не должны использовать $- знак перед some. То, что происходит, то, что с Вашей первой командой $2 печатается и затем $some=$2 переводит в $0=$2 с тех пор some unitialized (в некоторых 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}'
3
28.01.2020, 02:37
  • 1
    я действительно пробовал это прежде, но он дал мне ошибку: awk: program limit exceeded: maximum number of fields size=32767 –  Aditya Patawari 08.03.2013, 13:35
  • 2
    @AdityaPatawari: Затем то, что я подозреваю, Вы сделали, было: df|awk '{print $2; some=$2; print $some}' который попытался бы создать поле 38 448 788$ с Вашим демонстрационным входом. –  Scrutinizer 08.03.2013, 13:36
  • 3
    , который довольно возможен. –  Aditya Patawari 08.03.2013, 13:47

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

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

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

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

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

На Солярисе у меня есть доступ к "стандарту" awk, а также, предположительно, POSIX совместимая версия, установленная в/usr/xpg4/bin/awk. Оба из них приводят к тому же результату для следующего

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

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

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

Необходимо просто использовать "некоторых" в качестве переменной, например,

df | awk '{print "hello";some=$2; print some}'
1
28.01.2020, 02:37

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

См. эту ссылку для подобного обсуждения.

-2
28.01.2020, 02:37
  • 1
    Это является абсолютно поддельным. Mawk и простофиля о наравне на соответствии POSIX (хотя отсутствие поддержки классов символов в mawk является ошибкой). Ошибка здесь ничего не имеет к с выбором awk реализации. –  Gilles 'SO- stop being evil' 09.03.2013, 00:23

Теги

Похожие вопросы