Учитывая следующую команду:Как использовать «:» как разделитель полей awk?
echo "1: " | awk '/1/ -F ":" {print $1}'
почему AWK выход:
1:
Учитывая следующую команду:Как использовать «:» как разделитель полей awk?
echo "1: " | awk '/1/ -F ":" {print $1}'
почему AWK выход:
1:
"-F" является аргумент командной строки не AWK синтаксис, попробуйте:
echo "1: " | awk -F ":" '/1/ {print $1}'
-F
является до awk
:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
Не нужно цитировать двоеточие. – ceving
Если вы хотите сделать это программно, вы можете использовать FS
переменную:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Обратите внимание, что если вы измените его в главном цикле, а не петли BEGIN
, он принимает влияет для следующего строка считывается, поскольку текущая строка уже разделена.
Не нужно много писать. Просто поставьте желаемый разделитель полей с опцией -F в команде awk и номером столбца, который вы хотите распечатать, в разбивке по вашему указанному разделителю полей.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK работает как текстовый интерпретатор , который идет построчно для всего документа и , который идет fieldwise для каждой линии таким образом, $ 1, $ 2 .. $ п являются ссылками на поля каждой строки ($ 1 является первое поле, $ 2 - второе поле и т. д.). Вы можете определить разделитель полей с помощью переключателя «-F» в командной строке или в двух скобках с «FS = ...». Теперь рассмотрит ответ «Юрген»:
echo "1: " | awk -F ":" '/1/ {print $1}'
над полем boundries установлены на «:» поэтому у нас есть два fileds $ 1, который является «1» и $ 2, который является пустым space.After, приходит регулярное выражение «/ 1 /», которое указывает фильтру выводить первое поле только тогда, когда интерпретатор наткнется на строку, содержащую такое выражение (i означает 1); Выход команды «эхо» это одна линия, которая containes «1», так что фильтр будет работать ...
При работе на следующем примере:
echo "1: " | awk '/1/ -F ":" {print $1}'
Синтаксис грязен и интерпретатор предпочел игнорировать часть F ":" и переключился на разделитель поля по умолчанию, который является пустым сапфиром, таким образом выводя «1:» в качестве первого поля, и не будет второго поля!
Ответ JUERGEN содержит хороший синтаксис ...
У вас есть несколько способов, чтобы установить :
в качестве разделителя:
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
Вы также можете использовать регулярное выражение в качестве разделителя полей, следующее будет печатать «бар», используя регулярное выражение, чтобы установить число «10» в качестве разделителя.
echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
Или вы можете использовать:
echo "1: " | awk '/1/{print $1-":"}'
Это действительно смешно уравнение.
Задача Ignorant здесь:/1/part - рассказать awk только обрабатывать строки (или, если быть точнее, записи), которые содержат номер 1 вправо? – rantsh
@rantsh точно – rightfold