awk печатает поле в неправильном столбце

[ — это другое название встроенной команды test, см. здесь и здесь , также это .

Эта последовательность из ifоператоров, вероятно, была бы лучше в виде цикла. В Bash мы могли бы использовать косвенное расширение:

for ((i=1 ; i <= 10 ; i++)) ; do 
    if [ -n "${!i}" ] ; then 
        echo "${!i}"
    fi
done

Вероятно, более распространенной идиомой было бы использование shiftна каждой итерации, но это уничтожает список аргументов.

Кроме того, цитирование :здесь $0находится вне кавычек. В большинстве случаев более полезно держать все расширения переменных в кавычках, если вы явно не хотите слово -разбиение и расширение имени файла.

echo "Name of this script: "$0""

Так что скорее пиши:

echo "Name of this script: $0"

0
30.07.2019, 19:01
4 ответа

Вы получаете $3-, однако по умолчанию awk игнорирует начальные и конечные пробелы при разбиении записи на поля.

Вы должны иметь возможность заставить его рассматривать начальный пробел как пустое поле, явно установив разделитель полей ex.

$ cat clusters | awk -F'[ \t]+' '{print $3}'
STATE
active
active
active

тогда как

$ cat clusters | awk '{print $3}'
STATE
active
prod-cluster
dev-cluster
3
28.01.2020, 02:14

awk разбивает строки на основе разделителя (по умолчанию используется один или несколько пробелов, то есть табуляция или пробелы ). Чтобы было понятнее, вот ваши данные с данными, разделенными|

CURRENT|ID|STATE|NAME|PROVIDER
*|abcd|active|test-cluster|Imported
efgh|active|prod-cluster|Imported
xyzd|active|dev-cluster|Imported

Как вы можете видеть выше, в первой строке $1— это CURRENT, $2— это IDи так далее. Во второй строке $1— это *, $2— это abcdи т. д. Однако в третьей строке $1— это efgh, что соответствует столбцу ID. Поскольку в столбце ТЕКУЩИЙ нет ничего, кроме пробела, он игнорируется awk, и поэтому $3показывает ИМЯ для строк 3 и 4.

Что вам нужно сделать, так это удалить первый столбец, прежде чем отправлять его в awk. Следующая команда должна сделать это за вас.

rancher clusters | cut -b 8- | awk '{ print $3 }'

Команда cutв приведенном выше конвейере удалит первые 7 байтов в каждой строке и напечатает остальные в STDOUT.Это приведет к тому, что awkне будет путаться из-за разного количества столбцов в каждой строке.

1
28.01.2020, 02:14

awk по умолчанию разделяет записи на поля на основе непрерывных последовательностей пробелов и игнорирует начальные конечные пробелы. Поскольку ваше первое «поле» иногда пусто, для awk его не существует. Учитывая это, есть несколько способов вывести столбец NAME, самый простой из которых — считать поля с конца записи, а не с ее начала :

.
$ awk '{print $NF}' file
PROVIDER
Imported
Imported
Imported
$
$ awk '{print $(NF-1)}' file
NAME
test-cluster
prod-cluster
dev-cluster
$
$ awk '{print $(NF-2)}' file
STATE
active
active
active
$
$ awk '{print $(NF-3)}' file
ID
abcd
efgh
xyzd
$
$ awk '{print (NF>4 ? $(NF-4) : "")}' file
CURRENT
*


$

Вам нужно выполнить некоторые математические операции с последним, чтобы $(NF-4)не приводило к печати $0, когда NF равно 4. Вы можете вычислить предполагаемое количество полей вместо жесткого -кодирования 4 путем подсчета сколько полей в строке заголовка:

$ awk 'NR==1{max=NF-1} {print (NF>max ? $(NF-max) : "")}' file
CURRENT
*


$
1
28.01.2020, 02:14

Проблема в том, что иногда вывод вашей команды rancherимеет 5 полей на строку, а иногда 4.

Следующий вкладыш awk one -будет печатать правильное поле в зависимости от того, сколько полей (использует встроенная awk -переменнаяNF)в любой заданной строке ввода:

$ awk 'NF==5 {print $4}; NF==4 {print $3}' clusters.txt
NAME
test-cluster
prod-cluster
dev-cluster

В качестве альтернативы, если вы можете быть уверены, что пустых строк не будет, вы можете использовать:

$ awk '{print $(NF-1)}' clusters.txt 
NAME
test-cluster
prod-cluster
dev-cluster

Если есть пустая строка, вы получите сообщение об ошибке, подобное этому:

awk: cmd. line:1: (FILENAME=clusters.txt FNR=5) fatal: attempt to access field -1

Этого можно избежать с помощью:

awk 'NF>=1 {print $(NF-1)}' clusters.txt 
1
28.01.2020, 02:14

Теги

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