CLI AI

Вытащить колонку из CSV через awk (и когда не надо)

2026-05-06

awk -F, '{print $2}' file.csv достаёт колонку одной строкой, и для CSV, сгенерированного машиной, на этом можно закончить. Но у CSV, приехавшего из таблицы, есть ловушка, которая выдаёт не ошибку, а неправильные числа, — поэтому стоит знать, где проходит граница.

1. Одна колонка

clai
$ clai выведи первую колонку из data.csv→ awk -F, '{print $1}' data.csvnameAliceBob

-F, задаёт разделитель полей. Поля — это $1, $2, …, а $0 — вся строка целиком.

2. Несколько колонок, без заголовка

clai
$ clai выведи колонки 1 и 3 из data.csv без строки заголовка→ awk -F, 'NR>1 {print $1, $3}' data.csvAlice 100Bob 250

NR>1 пропускает первую строку. NR — номер записи, и использование его как условия это и есть awk-шное «для строк, где…».

3. Оставить запятые на выходе

clai
$ clai достань колонки 1 и 3 и отдай корректным csv→ awk -F, 'BEGIN{OFS=","} NR>1 {print $1,$3}' data.csvAlice,100Bob,250

print $1, $3 склеивает через OFS, а он по умолчанию пробел. Задайте его в BEGIN — и на выходе снова CSV.

4. Просуммировать колонку

clai
$ clai посчитай сумму третьей колонки в data.csv→ awk -F, 'NR>1 {s+=$3} END {print "total", s}' data.csvtotal 350

Ни объявления переменной, ни инициализации — числа в awk начинаются с нуля. Блок END выполняется один раз после последней строки.

5. Отфильтровать строки и взять колонку

clai
$ clai покажи имена, где сумма больше 200→ awk -F, 'NR>1 && $3 > 200 {print $1}' data.csvBob

Вот здесь awk выигрывает у таблицы: тот же однострочник пройдёт по файлу на 3 ГБ, не открывая его.

6. Ловушка: запятая внутри поля в кавычках

clai
$ clai выведи вторую колонку→ awk -F, 'NR>1 {print $2}' data.csvBerlin"Paris

В строке Bob,"Paris, France",250 три логических поля, но четыре запятые. Awk ничего не знает про кавычки, поэтому $2 превращается в "Paris, $3 — в France", а сумма из четвёртого пункта молча выдаёт 100 вместо 350. Ошибки не будет — будет неправильное число.

Грабли

  • Проверьте кавычки, прежде чем верить итогу. grep -c '"' file.csv — если ноль, обычный awk безопасен. Если нет, берите настоящий парсер CSV: csvcut -c 1,3 data.csv (csvkit), mlr --csv cut -f name,amount (Miller) или три строки на Python.
  • -F, — это не -F', '. Разделитель «запятая с пробелом» молча породит пустые поля в строках, где пробела нет.
  • Windows-переводы строк оставляют \r в последнем поле. $NF перестаёт сравниваться без всякой видимой причины. Лечится awk -F, '{gsub(/\r$/,"")} …' или прогоном dos2unix.

Похожие вопросы

Как вывести последнюю колонку? awk -F, '{print $NF}'. NF — количество полей, поэтому $NF последнее, а $(NF-1) предпоследнее.

Как задать разделителем табуляцию? awk -F'\t' — в кавычках, чтобы оболочка не съела обратный слеш.

Awk быстрее pandas для этого? Для извлечения или суммирования колонки из большого файла — да, заметно: он потоковый и не строит структуру данных в памяти. Для джойнов и переформатирования берите pandas.

Читайте также

Опишите, что нужно достать, — программу для awk напишет CliAI, вместе с тем самым BEGIN{OFS=","}, который вы забудете. Установка одной строкой.