Как использовать ":" как разделитель полей awk?

Указанная следующая команда:

echo "1: " | awk '/1/ -F ":" {print $1}'

почему вывод awk:

1: 

Ответ 1

"- F" - это аргумент командной строки, а не awk-синтаксис, попробуйте:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

Ответ 2

Если вы хотите сделать это программно, вы можете использовать переменную FS:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

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

Ответ 3

У вас есть несколько способов установить : в качестве разделителя:

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

Все они эквивалентны и для a возвращают 1 для ввода образца "1: 2: 3":

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

Ответ 4

-F является аргументом самой awk:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

Ответ 5

AWK работает как текстовый интерпретатор, который действует одинаково для всего документа и действует по полю для каждой строки, поэтому $ 1, $ 2.. $ n являются ссылками на поля каждой строки ($ 1 - первое поле, $ 2 - второе поле и т.д....). Вы можете определить разделитель полей, используя переключатель "-F" в командной строке или в двух скобках с "FS =...". Теперь рассмотрим ответ "JUERGEN":

echo "1: " | awk -F  ":" '/1/ {print $1}'

Над полями установлены границы ":", поэтому у нас есть два поля $ 1, которое равно "1", и $ 2, которое является пустым пространством. После этого появляется регулярное выражение "/1/", которое инструктирует фильтр выводить только первое поле когда переводчик натыкается на строку, содержащую такое выражение (я имею в виду 1); Вывод команды "echo" - это одна строка, содержащая "1", поэтому фильтр будет работать...

При работе со следующим примером:

echo "1: " | awk '/1/ -F ":" {print $1}'

Синтаксис грязный, и интерпретатор решил игнорировать часть F ":" и переключается на разделитель полей по умолчанию, который является пустым пространством, таким образом, выводя "1:" в качестве первого поля, и второго поля не будет!

Ответ JUERGEN содержит хороший синтаксис...

Ответ 6

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

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

Ответ 7

Не нужно так много писать. Просто поставьте желаемый разделитель полей с опцией -F в команде awk и номером столбца, который вы хотите распечатать, разделенным в соответствии с вашим указанным разделителем полей.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

Ответ 8

Или вы можете использовать:

echo "1: " | awk  '/1/{print $1-":"}' 

Это действительно смешное уравнение.