Друк стовпця, розділеного комами, за допомогою командного рядка Awk


84

У мене тут проблема. Мені потрібно надрукувати стовпець у текстовому файлі за допомогою awk. Однак стовпці взагалі не розділяються пробілами, лише за допомогою однієї коми. Виглядає приблизно так:

column1,column2,column3,column4,column5,column6

Як роздрукувати 3-й стовпець за допомогою awk?


1
Чому ви хочете використовувати awk? ІМХО це дуже проста проблема. Чи є у вас спроби вирішити це?
TrueY

Відповіді:


126

Спробуйте:

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

Тут у -F ви кажете awk, що використовує "," як роздільник поля.


Я переглядав багато сторінок і отримав набагато більше результатів, і це було на сьогоднішній день найкращим :) Дякую
AJC

41

Якщо ваша єдина вимога - надрукувати третє поле кожного рядка з кожним полем, відокремленим комою, ви можете використовувати вирізати:

cut -d, -f3 file
  • -d, встановлює роздільник на кому
  • -f3 визначає, що друкується лише третє поле

1
Це найкраща відповідь на це питання. awkдуже корисний, коли скажемо, що я хочу друкувати [col1]:[col5]з різними видами та іншим форматуванням
Arijoon

28

Спробуйте це awk

awk -F, '{$0=$3}1' file
column3
  • , Поділіть поля на ,
  • $0=$3 Встановіть для рядка лише поле 3
  • 1Роздрукувати все. ( пояснено тут )

Це також можна використовувати:

awk -F, '{print $3}' file

4
Окрім того, що він коротший, це набагато складніше зрозуміти комусь, хто не знайомий з awk. Варто додати якесь пояснення, щоб зробити цю відповідь більш корисною.
Том Фенек

1
+1. Трохи загадковий, але працює як Шаффхаузен.
TrueY

1
@TomFenech: Я думаю, cut -d, -f3 fileце так само загадково, як цей, якщо хтось не знайомий cut. ;)
TrueY

3
@TrueY надано, хоча одна різниця полягає в тому, що cut --helpце пояснює все, що вам потрібно було знати, тоді як awk --helpні. Можливо, мені слід було піти cut --delimiter=, --fields=3 file, хоча я сумніваюся, що довші комутатори є портативними :)
Том Фенек

2

Хоча простий -без розчину в :

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

Тоді це працює швидше для невеликих файлів (<100 рядків) оскільки він використовує менше ресурсів (уникає дзвінків на дорогі forkта execveсистемні дзвінки).

EDIT від Еда Мортона (вибачте за привітання, я не знаю, чи є кращий спосіб вирішити це питання):

Щоб заспокоїти міф про те, що оболонка буде працювати швидше, ніж 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
While readцикли набагато повільніші, ніж awk, навіть якби це було швидше з крихітними файлами, різниця швидкості була б незначною.

@Jidder: Ти маєш рацію! IMHO, тому безглуздо використовувати awk для невеликих файлів.
TrueY

1
@EdMorton: Ви маєте рацію. Для більших і складніших проблем я безумовно використовую awk (частіше викликається зі скрипта bash ), але для невеликих файлів та простих завдань я використовую чистий bash . З іншого боку, для ще більш складних завдань я віддаю перевагу perl для сценаріїв.
TrueY

1
@EdMorton: Ви знову праві, і, здається, echoце не легко вирішити. У такому випадку можна скористатися, printf "%s\n" "$a"щоб позбутися цього. Це також вбудований bash .
TrueY

1
@EdMorton: Ти маєш рацію! Якщо хтось використовує будь-який інструмент, він / вона повинен знати можливі проблеми. Тож я пропоную кожному користуватися адекватним інструментом. Якщо я пишу модуль ядра, я точно не використовую bash . ;) Але для такого непомітного завдання цього може бути достатньо.
TrueY
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.