2010-04-09 3 views

ответ

239

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

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

Задача Ignorant здесь:/1/part - рассказать awk только обрабатывать строки (или, если быть точнее, записи), которые содержат номер 1 вправо? – rantsh

+0

@rantsh точно – rightfold

12

-F является до awk:

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

Не нужно цитировать двоеточие. – ceving

46

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

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

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

1

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

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

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

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

7

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

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 
4

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

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

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

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

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

Смежные вопросы