Подтвердить что ты не робот

Печать столбца через запятую с помощью командной строки Awk

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

column1,column2,column3,column4,column5,column6

Как бы я распечатать 3-й столбец с помощью awk?

4b9b3361

Ответ 1

Try:

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

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

Ответ 2

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

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

Ответ 3

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

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

Это также может быть использовано:

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

Ответ 4

Простой, хотя awk - меньшее решение в :

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

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

РЕДАКТИРОВАТЬ от Эд Мортона (извините за привет-ответ, я не знаю, есть ли лучший способ решить эту проблему):

Чтобы положить конец мифу о том, что оболочка будет работать быстрее, чем 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

Я ожидаю, что если вы получите файл с достаточным количеством REALY, вы увидите, что оболочка script выполняется в доли секунды, быстрее, чем awk script, но кому это нужно?

И если вы не верите, что сложнее писать надежные сценарии оболочки, чем awk-скрипты, посмотрите на эту ошибку в оболочке script, которую вы разместили:

$ 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

$