Если у меня есть файл csv, есть ли быстрый способ bash распечатать содержимое только одного столбца? Можно с уверенностью предположить, что каждая строка имеет одинаковое количество столбцов, но содержимое каждого столбца будет иметь разную длину.
111
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'
будет печатать2
вместо2,3,4,5
.gawk -F"|" "{print $13}" files*.csv
...,"string,string",...
"
а последний заканчиваться"
awk -F "\"*;\"*" '{print $2}' textfile.csv
да.
cat mycsv.csv | cut -d ',' -f3
напечатает 3-й столбец.источник
awk
Самый простой способ сделать это - просто использовать csvtool . У меня были и другие варианты использования csvtool, и он может соответствующим образом обрабатывать кавычки или разделители, если они появляются в самих данных столбца.
Замена 2 на номер столбца эффективно извлечет данные столбца, которые вы ищете.
источник
cat input.csv | csvtool formath '%(2)\n' -
Примечание. Я знаю, что здесь cat бесполезен, но использовать его для любой команды, которая обычно экспортирует csv.format '%(2)\n'
команда не может определить, где заканчивается одно поле. (csvtool 1.4.2)csvtool
похоже, требуют использования-
в качестве входного имени файла для чтения из stdin.csvtool format '%(1),%(10)\n' - < in.csv > out.csv
Приземлился сюда, чтобы извлечь из файла, разделенного табуляцией. Подумал добавить.
Где
-f2
извлекает 2, ненулевой индексированный столбец или второй столбец.источник
cat
этом нет необходимости:< textfile.tsv cut -f2 -s
Многие ответы на эти вопросы прекрасны, а некоторые даже заглянули в крайние случаи. Я хотел бы добавить простой ответ, который можно использовать ежедневно ... когда вы в основном попадаете в эти угловые случаи (например, экранирование запятых или запятых в кавычках и т. Д.).
Таким образом, используя BEGIN (Выполнить перед вводом), мы можем установить в этом поле все, что захотим ...
Приведенный выше код напечатает 3-й столбец в файле csv.
источник
Другие ответы работают хорошо, но поскольку вы запросили решение, используя только оболочку bash, вы можете сделать это:
А затем вы можете вытащить столбцы (первые в этом примере) следующим образом:
Итак, здесь происходит несколько вещей:
while IFS=,
- это говорит об использовании запятой в качестве IFS (внутреннего разделителя полей), который оболочка использует, чтобы знать, что разделяет поля (блоки текста). Так сказать IFS = - это все равно, что сказать, что "a, b" то же самое, что "a b" было бы, если бы IFS = "" (что и есть по умолчанию).read -a csv_line;
- это говорит читать в каждой строке, по одной, и создавать массив, каждый элемент которого называется "csv_line", и отправлять его в раздел "do" нашего цикла while.do echo "${csv_line[0]}";done < file
- теперь мы находимся в фазе «do», и мы говорим, что эхо 0-й элемент массива «csv_line». Это действие повторяется в каждой строке файла. Эта< file
часть просто сообщает циклу while, откуда читать. ПРИМЕЧАНИЕ: помните, что в bash массивы индексируются 0, поэтому первый столбец - это 0-й элемент.Итак, вы получили столбец из CSV в оболочке. Другие решения, вероятно, более практичны, но это чистый bash.
источник
Вы можете использовать GNU Awk, см. Эту статью руководства пользователя . В качестве улучшения решения, представленного в статье (июнь 2015 г.), следующая команда gawk позволяет использовать двойные кавычки внутри полей с двойными кавычками; там двойная кавычка помечается двумя последовательными двойными кавычками (""). Кроме того, это позволяет пустые поля, но даже это не может обрабатывать многострочные поля . В следующем примере печатается 3-й столбец (
c=3
переход) textfile.csv:Обратите внимание на использование
dos2unix
для преобразования возможных разрывов строк в стиле DOS (CRLF, т.е. «\ r \ n») и кодировки UTF-16 (с отметкой порядка байтов) в «\ n» и UTF-8 (без отметки порядка байтов) соответственно. Стандартные файлы CSV используют CRLF как разрыв строки, см. Википедию .Если ввод может содержать многострочные поля, вы можете использовать следующий скрипт. Обратите внимание на использование специальной строки для разделения записей в выводе (поскольку новая строка разделителя по умолчанию может встречаться внутри записи). Опять же, в следующем примере печатается третий столбец (
c=3
переход) textfile.csv:Есть другой подход к проблеме. csvquote может выводить содержимое CSV-файла, измененного таким образом, что специальные символы в поле преобразуются, чтобы можно было использовать обычные инструменты обработки текста Unix для выбора определенного столбца. Например, следующий код выводит третий столбец:
csvquote
может использоваться для обработки произвольных больших файлов.источник
Вот пример файла csv с 2 столбцами
Чтобы получить первый столбец, используйте:
f обозначает поле, а d обозначает разделитель
Выполнение указанной выше команды приведет к следующему результату.
Вывод
Чтобы получить только 2-й столбец:
А вот и результат Output
Другой вариант использования:
Ваш входной файл csv содержит 10 столбцов, и вам нужны столбцы со 2 по 5 и столбцы 8, используя запятую в качестве разделителя ".
cut использует -f (что означает «поля») для указания столбцов и -d (что означает «разделитель»), чтобы указать разделитель. Вам необходимо указать последнее, потому что в некоторых файлах могут использоваться пробелы, табуляции или двоеточия для разделения столбцов.
cut - это командная утилита, и вот еще несколько примеров:
источник
Мне нужен был правильный анализ CSV, а не
cut
/awk
и молитва. Я пробую это на Mac безcsvtool
, но Mac действительно поставляется с рубином, поэтому вы можете:источник
Сначала мы создадим базовый CSV
Тогда получаем 1-й столбец
источник
где 2 - интересующий вас столбец
вы также можете сделать
сделать несколько столбцов
источник
Я думаю, что проще всего использовать csvkit :
Получает 2-й столбец:
csvcut -c 2 file.csv
Однако есть также csvtool и, вероятно, ряд других инструментов csv bash:
sudo apt-get install csvtool
(для систем на базе Debian)Это вернет столбец с первой строкой с идентификатором.
csvtool namedcol ID csv_file.csv
Это вернет четвертую строку:
csvtool col 4 csv_file.csv
Если вы хотите удалить строку заголовка:
csvtool col 4 csv_file.csv | sed '1d'
источник
Интересно, почему ни в одном из ответов до сих пор не упоминается csvkit.
документация csvkit
Я использую его исключительно для управления данными csv, и пока я не нашел проблемы, которую я не мог бы решить с помощью cvskit.
Чтобы извлечь один или несколько столбцов из файла cvs, вы можете использовать
csvcut
служебную программу, которая является частью набора инструментов. Чтобы извлечь второй столбец, используйте эту команду:справочная страница csvcut
Если строки в csv цитируются, добавьте символ кавычки с
q
опцией:Установите с помощью
pip install csvkit
илиsudo apt install csvkit
.источник
Вы не можете этого сделать без полноценного парсера CSV.
источник
cut
?Некоторое время я использовал этот код, он не будет «быстрым», если вы не посчитаете «вырезание и вставку из stackoverflow».
Вместо IFS в цикле используются операторы $ {##} и $ {%%}. Он вызывает 'err' и 'die' и поддерживает только запятую, тире и вертикальную черту в качестве символов SEP (это все, что мне нужно).
Пример:
источник
Вы также можете использовать цикл while
источник