Вопрос Игнорирования здесь: часть / 1 / должна сказать awk только для обработки строк (или записей, если быть более точным), которые содержат число 1, верно?
Рантс
3
Синтаксис @rantsh Awk выглядит следующим образом (pattern){action}. Если pattern(в основном условный оператор) имеет значение true , actionвыполняется. Если patternне доступно, trueподразумевается. Вот то pattern, /1/какие состояния соответствуют регулярному выражению 1в текущей записи$0
kvantour
62
Если вы хотите сделать это программно, вы можете использовать FSпеременную:
Обратите внимание, что если вы измените его в основном цикле, а не в BEGINцикле, это повлияет на следующую прочитанную строку, поскольку текущая строка уже разбита.
Приостановлено до дальнейшего уведомления. источник
35
У вас есть несколько способов установить в :качестве разделителя:
какой предпочтительный способ? Я предполагаю, что последний пример с BEGINутверждением будет наиболее правильным (в соответствии с общим awkсинтаксисом).
1
@ randomware все они в порядке. Я имею тенденцию использовать, BEGINесли я использую файл, чтобы сохранить все это, в то время как -Fпригодится с однострочниками.
Федорки 'ТАК прекрати вредить'
1
Надо сказать, что между третьим случаем и всеми остальными существуют тонкие различия. Пример: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileиawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Вы также можете использовать регулярное выражение в качестве разделителя полей, ниже будет напечатано «bar» с помощью регулярного выражения для установки числа «10» в качестве разделителя.
Не нужно так много писать. Просто поместите желаемый разделитель полей с опцией -F в команду awk и номер столбца, который вы хотите распечатать отдельно, в соответствии с указанным разделителем полей.
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:" в качестве первого поля, и второго поля не будет!
(pattern){action}
. Еслиpattern
(в основном условный оператор) имеет значение true ,action
выполняется. Еслиpattern
не доступно,true
подразумевается. Вот тоpattern
,/1/
какие состояния соответствуют регулярному выражению1
в текущей записи$0
Если вы хотите сделать это программно, вы можете использовать
FS
переменную:Обратите внимание, что если вы измените его в основном цикле, а не в
BEGIN
цикле, это повлияет на следующую прочитанную строку, поскольку текущая строка уже разбита.источник
У вас есть несколько способов установить в
:
качестве разделителя:Все они эквивалентны и для возврата вернутся
1
для примера ввода «1: 2: 3»:источник
BEGIN
утверждением будет наиболее правильным (в соответствии с общимawk
синтаксисом).BEGIN
если я использую файл, чтобы сохранить все это, в то время как-F
пригодится с однострочниками.awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
иawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
это аргумент дляawk
себя:источник
Вы также можете использовать регулярное выражение в качестве разделителя полей, ниже будет напечатано «bar» с помощью регулярного выражения для установки числа «10» в качестве разделителя.
источник
Не нужно так много писать. Просто поместите желаемый разделитель полей с опцией -F в команду awk и номер столбца, который вы хотите распечатать отдельно, в соответствии с указанным разделителем полей.
источник
AWK работает как текстовый интерпретатор, который действует одинаково для всего документа и действует по полю для каждой строки, поэтому $ 1, $ 2 .. $ n являются ссылками на поля каждой строки ($ 1 - первое поле, $ 2 - второе поле и т. Д. ...). Вы можете определить разделитель полей, используя переключатель «-F» в командной строке или в двух скобках с «FS = ...». Теперь рассмотрим ответ «JUERGEN»:
Над полями установлены границы «:», поэтому у нас есть два поля $ 1, которое равно «1», и $ 2, которое является пустым пространством. После этого появляется регулярное выражение «/ 1 /», которое инструктирует фильтр выводить только первое поле когда переводчик натыкается на строку, содержащую такое выражение (я имею в виду 1); Вывод команды "echo" - это одна строка, содержащая "1", поэтому фильтр будет работать ...
При работе со следующим примером:
Синтаксис грязный, и интерпретатор решил игнорировать часть F ":" и переключается на разделитель полей по умолчанию, который является пустым пространством, таким образом, выводя "1:" в качестве первого поля, и второго поля не будет!
Ответ JUERGEN содержит хороший синтаксис ...
источник
Или вы можете использовать:
Это действительно забавное уравнение.
источник
/1/
значит?