2014-11-10 9 views
36

У меня проблема. Я должен напечатать столбец в текстовом файле с помощью awk. Однако столбцы вообще не разделены пробелами, а используются только одна запятая. Выглядит примерно так:AWK колонка печати командной строки, разделенная запятой

column1,column2,column3,column4,column5,column6 

Как распечатать третью колонку с помощью awk?

Спасибо за помощь.

+0

Почему вы хотели бы использовать 'awk'? ИМХО это очень простая проблема. У вас есть какой-нибудь вопрос, чтобы решить эту проблему? – TrueY

ответ

56

Try:

awk -F',' '{print $3}' myfile.txt 

Здесь в -F вы говорите AWK, что использование "" в качестве разделителя полей.

+0

Я просматривал много страниц и получал намного больше результатов, и это было, безусловно, самое лучшее :) Спасибо – AJC

9

Попробуйте это awk

awk -F, '{$0=$3}1' file 
column3 
  • , Разделить поля на ,
  • $0=$3 Установите линию только поле 3
  • 1 Печать из всех. (explained here)
+4

Как и быть короче, это намного труднее для кого-то, незнакомого с awk, понять. Было бы полезно добавить некоторое объяснение, чтобы сделать этот ответ более полезным. –

+1

+1. Немного загадочно, но работает как Шаффхаузен. – TrueY

+1

@TomFenech: Я думаю, что 'cut -d, -f3 file' такой же загадочный, как этот, если кто-то не знаком с' cut'. ;) – TrueY

3

Простой, хотя -Меньше раствор в :

while IFS=, read -r a a a b; do echo "$a"; done <inputfile 

Он работает быстрее для небольших файлов (< 100 линий), то как он использует меньше ресурсов (избегает вызова дорогой fork и execve системных вызовов).

EDIT от Ed Мортон (извините за привет-подъемное ответ, я не знаю, если есть лучший способ решения этой проблемы):

Чтобы отмести миф, что оболочка будет работать быстрее, чем AWK для маленькие файлы:

$ wc -l file 
99 file 

$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null 

real 0m0.016s 
user 0m0.000s 
sys  0m0.015s 

$ time awk -F, '{print $3}' file >/dev/null 

real 0m0.016s 
user 0m0.000s 
sys  0m0.015s 

Я ожидаю, что если вы получаете достаточно НАСТОЯЩЕМУ небольшой файл, то вы увидите скрипт запуска в доли мгновение ока быстрее, чем сценарий AWK, но кого это волнует?

И если вы не верите, что это труднее писать мощные скрипты, чем AWK скрипты, обратите внимание на эту ошибку в сценарии оболочки вы публикуемую:

$ cat file 
a,b,-e,d 
$ cut -d, -f3 file 
-e 
$ awk -F, '{print $3}' file 
-e 
$ while IFS=, read -r a a a b; do echo "$a"; done <file 

$ 
+1

' В то время как чипы read's заметно медленнее, чем awk, даже если это были быстрее с крошечными файлами, разница в скорости была бы небрежной. –

+0

@Jidder: Вы правы! IMHO, поэтому бессмысленно использовать [tag: awk] для небольших файлов. – TrueY

+0

Я сомневаюсь, что он работает быстрее, чем awk для небольших файлов, и в зависимости от того, что будет быстрее, разница будет незначительной, поэтому зачем писать все это, когда вы можете просто писать гораздо более четкие, более короткие, более расширяемые, более надежные и более портативные 'awk -F , '{print $ 3}' file'? Избегать вызова «внешних» инструментов не является целью программирования оболочки - вся причина, по которой оболочка существует, - это клей для последовательных вызовов для «внешних» инструментов. –

25

Если единственным требованием является то, чтобы напечатать треть поле каждой строки, с каждым полем с разделителями запятыми, вы можете использовать сокращение:

cut -d, -f3 file 
  • -d, устанавливает разделитель запятой
  • -f3 указывает, что должно быть напечатано только третье поле.
+4

+1 для правильного ответа. –

+1

Это лучший ответ на этот вопрос. 'awk' приходит очень удобно, когда позволяет сказать, что я хочу напечатать' [col1]: [col5] 'с разными dels и другим форматированием – Arijoon