Как вырезать столбцы 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