awk -F, '{print $2}' file.csv достаёт колонку одной строкой, и для CSV, сгенерированного машиной, на этом можно закончить. Но у CSV, приехавшего из таблицы, есть ловушка, которая выдаёт не ошибку, а неправильные числа, — поэтому стоит знать, где проходит граница.
1. Одна колонка
$ clai выведи первую колонку из data.csv→ awk -F, '{print $1}' data.csvnameAliceBob
-F, задаёт разделитель полей. Поля — это $1, $2, …, а $0 — вся строка целиком.
2. Несколько колонок, без заголовка
$ clai выведи колонки 1 и 3 из data.csv без строки заголовка→ awk -F, 'NR>1 {print $1, $3}' data.csvAlice 100Bob 250
NR>1 пропускает первую строку. NR — номер записи, и использование его как условия это и есть awk-шное «для строк, где…».
3. Оставить запятые на выходе
$ 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 посчитай сумму третьей колонки в data.csv→ awk -F, 'NR>1 {s+=$3} END {print "total", s}' data.csvtotal 350
Ни объявления переменной, ни инициализации — числа в awk начинаются с нуля. Блок END выполняется один раз после последней строки.
5. Отфильтровать строки и взять колонку
$ clai покажи имена, где сумма больше 200→ awk -F, 'NR>1 && $3 > 200 {print $1}' data.csvBob
Вот здесь awk выигрывает у таблицы: тот же однострочник пройдёт по файлу на 3 ГБ, не открывая его.
6. Ловушка: запятая внутри поля в кавычках
$ 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.
Читайте также
- Найти и заменить во всех файлах проекта
- Переименовать сотни файлов: от циклов
forк обычным словам - От однострочника к закоммиченному скрипту: когда пора
Опишите, что нужно достать, — программу для awk напишет CliAI, вместе с тем самым BEGIN{OFS=","}, который вы забудете. Установка одной строкой.