Что означает эта функция? функция $$ 1 - PullRequest
2 голосов
/ 24 июня 2019

Это первый раз, когда я видел такое использование. К сожалению, я не могу найти соответствующую информацию.

awk '{print $$1}'

Для чего $$1? Это массив?

$ echo -e "2 2 3 4\n2 22 3 4 5 6\na 2 3" | awk '{print $$1}'
2
22
a 2 3
$ echo -e "2 2 3 4\n2 22 3 4 5 6\na 2 3" | awk '{print $$2}'
2

2
$ echo -e "2 2 3 4\n2 22 3 4 5 6\na 2 3" | awk '{print $$3}'
3
3
3

Выше приведены только примеры. Обратите внимание, что это не один $, это $$

1 Ответ

5 голосов
/ 24 июня 2019

Косвенная полевая адресация

Посмотрите на это как на это $($1).

Таким образом, для второй строки 2 22 3 4 5 6 эта команда awk '{print $$1}' будет выглядеть как $1 (первое поле). Он содержит значение 2, тогда результат будет $2 (второе поле), поэтому результат $$1 будет 22. $$1 возьмет номер из поля # 1 ($1) и использует его в качестве номера поля для внешнего $.

Пример:

$ echo -e "1 b c d\n2 b c d\n3 b c d\n4 b c d" 
1 b c d
2 b c d
3 b c d
4 b c d

Тогда:

$ echo -e "1 b c d\n2 b c d\n3 b c d\n4 b c d" | awk '{print $$1}'
1  # since filed #1=1 result print first field
b  # since filed #1=2 result print secondfield
c  # since filed #1=3 result print third field
d  # since filed #1=4 result print fourth field

Редактировать
Как указывает @kvantour, вы можете добавлять сколько угодно $, сколько захотите

awk '{print $$$1}' = awk '{print $$($1)}' = awk '{print $($($1))}'

И, как указывает @Ed, вы можете сделать его более читабельным, развернув его так:

awk '{print $$1}' = awk '{fieldNr=$1; print $fieldNr}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...