Как использовать ":" в качестве разделителя полей awk? - PullRequest
213 голосов
/ 09 апреля 2010

С учетом следующей команды:

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

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

1: 

Ответы [ 8 ]

333 голосов
/ 09 апреля 2010

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

 echo "1: " | awk -F  ":" '/1/ {print $1}'
55 голосов
/ 09 апреля 2010

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

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

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

23 голосов
/ 25 марта 2016

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

awk -F: '{print $1}'

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

awk '{print $1}' FS=:

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

Все они эквивалентны и для возврата вернут 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
12 голосов
/ 09 апреля 2010

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

$echo "1: " | awk -F":" '/1/ {print $1}'
1
5 голосов
/ 16 сентября 2015

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 содержит хороший синтаксис ...

4 голосов
/ 05 августа 2016

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

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
3 голосов
/ 02 мая 2015

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

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

echo "1#2" | awk -F# '{print $1}'  
1
2 голосов
/ 04 октября 2016

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

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

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

...