Как вырезать столбцы csv

У меня есть набор файлов csv (около 250), каждый из которых имеет от 300 до 500 записей. Мне нужно вырезать 2 или 3 столбца из каждого файла и хранить его на другом. Я использую ОС ubuntu. Есть ли способ сделать это в команде или утилите?

Ответы

Ответ 1

Если вы знаете, что разделитель столбцов не встречается внутри полей, вы можете использовать cut.

$ cat in.csv
foo,bar,baz
qux,quux,quuux
$ cut -d, -f2,3 < in.csv 
bar,baz
quux,quuux

Вы можете использовать оболочку buildin 'for' для перебора всех входных файлов.

Ответ 2

Если поля могут содержать разделитель, вы должны найти библиотеку, которая может анализировать файлы CSV. Как правило, языки сценариев общего назначения будут включать в себя CSV-модуль в их стандартной библиотеке.

Ruby:   require 'csv'
Python: import csv
Perl:   use Text::ParseWords;

Ответ 3

Если ваши поля содержат запятые или символы новой строки, вы можете использовать вспомогательную программу, которую я написал, чтобы разрезать (и другие инструменты обработки текста UNIX) правильную работу с данными.

https://github.com/dbro/csvquote

Эта программа находит специальные символы внутри указанных полей и временно заменяет их непечатаемыми символами, которые не будут путать программу вырезания. Затем они восстанавливаются после завершения разреза.

Решение

lutz:

csvquote in.csv | cut -d, -f2,3 | csvquote -u 

Ответ 4

Если вы использовали ssconvert для получения CSV, вы можете попробовать:

ssconvert -O 'separator="|"' "file.xls" "file.txt"

Обратите внимание на расширение TXT вместо CSV, таким образом будет использоваться Gnumeric_stf: stf_assistant exporter вместо Gnumeric_stf: stf_csv, что позволяет использовать параметры (параметр -O). В противном случае вы получите файл. Хранитель файла не принимает ошибки параметров. Характер трубы намного менее вероятен, но вы можете проверить его раньше.

Затем вы можете переименовать его и сделать следующее:

cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head