Як використовувати ":" як подільник поля awk?


Відповіді:


382

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

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

42
Питання невігласа тут: / 1 / частина полягає в тому, щоб сказати awk лише обробляти рядки (або точніші записи), які містять число 1, правильно?
rantsh

3
Синтаксис @rantsh Awk виглядає так (pattern){action}. Якщо pattern(переважно умовне твердження) вірно , actionвиконується. Якщо patternнемає, trueмається на увазі. Ось те pattern, про /1/що йдеться , регулярний1$0
вирівнювання

62

Якщо ви хочете це робити програмно, ви можете використовувати FSзмінну:

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

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


35

У вас є кілька способів встановити :роздільник:

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

який є кращим способом? Я припускаю, що останній приклад із BEGINтвердженням буде найбільш правильним (узгоджується із загальним awkсинтаксисом).

1
@ випадкових програм все у них добре. Я схильний використовувати, BEGINякщо я використовую файл для зберігання всієї речі, хоча -Fце зручно з однокласниками.
fedorqui 'ТАК перестаньте шкодити'

1
Потрібно сказати, що між третім випадком та всіма іншими є тонкі відмінності. Приклад: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileіawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour



6

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

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

4

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

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

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

4

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

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

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

Маючи справу з наступним прикладом:

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

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

Відповідь JUERGEN містить хороший синтаксис ...


2

Або ви можете використовувати:

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

Це справді смішне рівняння.


1
що /1/означає?

Знайдіть візерунок. У цьому випадку «1»
Хосе Діас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.