поле друку awk у неправильному стовпці


0

Коли я запускаю команду нижче, вона виводить список стовпців наступним чином:

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

Коли я намагаюся надрукувати стовпчик NAME, тестовий кластер не повертається в результати

# rancher clusters | awk '{print $3}'
STATE
active
prod-cluster
dev-cluster

Ви можете бачити, що частини стовпця ДЕРЖАВНО відображаються у друкованому стовпці ІМ’Я.

Коли я друкую четвертий стовпець, тестовий кластер повертається разом із NAME

# rancher clusters | awk '{print $4}'
NAME
test-cluster
Imported
Imported

Чому awk не повертає значення з точного стовпця, який надруковано? Що може призвести до повернення значень з одного стовпця в інший? Моє сподівання - коли я надрукую 3 долари, усі результати отримаю в четвертому стовпчику (NAME).


2
Чи вкладка виводу обмежена, або це просто використання декількох символів пробілу?
Kusalananda

Відповіді:


1

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, що відповідає стовпцю ідентифікатора. Оскільки в стовпці "СУЧАСНІ" немає нічого, окрім пробілу, воно ігнорується awk, а тому $3показує НАЗВУ для рядків 3 та 4.

Що вам потрібно зробити, це зняти перший стовпець, перш ніж відправити його на пробудження. Наступна команда повинна зробити це для вас.

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

cutКоманда в трубопроводі вище буде видаляти перші 7 байт в кожному рядку, і друкувати інше STDOUT. Це призведе до того, що awkне плутатимуться з різною кількістю стовпців у кожному рядку.


3

Ви будете отримувати $3- проте, за замовчуванням, AWK ігнорує початковий і кінцеві пробілу при дробленні записи на поля.

Ви повинні мати змогу змусити її розглядати провідне пробіл як порожнє поле, встановивши роздільник поля прямо.

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

тоді як

$ cat clusters | awk '{print $3}'
STATE
active
prod-cluster
dev-cluster

Це має бути прийнятою відповіддю.
Wildcard

1

За замовчуванням 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

Проблема полягає в тому, що інколи у вашій rancherкоманді є 5 полів на рядок, а іноді - 4.

Наступний однокласник awk надрукує правильне поле залежно від того, скільки полів (використовуючи вбудовану змінну 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.