Как вызвать awk из bash с последним полем в качестве переменной - PullRequest
0 голосов
/ 07 июня 2018

Предположим, у меня есть входной файл CSV с именем input.csv:

1,2,3,valueIWantToPrint
3,5,2,valueIWantToPrint

В настоящее время мне нужно напечатать последний элемент каждой строки этого ввода с помощью awk, что легко достигается с помощью разделителя полей иПеременные NF:

awk -F"," '{print $NF}' input.csv

Но теперь допустим, что я хочу создать поле, в которое я хочу напечатать переменную, потому что позже, возможно, формат ввода изменится, и это будет другое поле.

Входной файл:

1,2,valueIWantToPrint,3
3,5,valueIWantToPrint,2

Сценарий:

FIELD_TO_PRINT=3
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv

Хорошо, это было легко.Но теперь, чтобы сделать его максимально гибким, я хотел бы иметь возможность установить FIELD_TO_PRINT в эквивалент NF, чтобы я мог напечатать последнее значение независимо от количества полей.То, что мне нужно, выглядит примерно так:

Ввод:

1,2,3,7,2,5,23,1,3,6,valueIWantToPrint
3,5,2,6,3,valueIWantToPrint

Этот скрипт не работает, но иллюстрирует то, что я пытаюсь выполнить:

FIELD_TO_PRINT=NF
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv

Есть ли удобный способ задать для переменной значение «последнее поле в записи»?Этот пример довольно тривиален, но в конечном итоге переменная FIELD_TO_PRINT будет помещена в отдельный файл конфигурации, а сценарий awk будет намного больше и сложнее.Поэтому хороший способ сделать это будет очень полезен.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете использовать этот обходной способ:

Отрицательный n означает NF:

n=-1
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv

valueIWantToPrint
valueIWantToPrint

и когда n > 0поле для печати с номером:

n=3
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv

3
2
0 голосов
/ 07 июня 2018

Вы можете использовать этот трюк

$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file

valueIWantToPrint
valueIWantToPrint

при условии, что отрицательные индексы начинают отсчитываться от NF в обратном направлении, поэтому -2 будет означать предпоследнее поле и т. Д.

...