Как извлечь один столбец CSV-файла

Если у меня есть CSV-файл, есть быстрый Баш способ, чтобы распечатать содержимое только одного столбца? Можно с уверенностью предположить, что каждая строка имеет одинаковое количество столбцов, а каждый столбец'содержание С бы разной длины.

Решение

Вы можете использовать awk, для этого. Изменение '$2' к N-му столбцу, который вы хотите.

awk -F "\"*,\"*" '{print $2}' textfile.csv
Комментарии (5)

да. кошка mycsv.КШМ | вырезать -д ',' -Ф3 будет печатать 3-й столбец.

Комментарии (3)

Самый простой способ я был в состоянии сделать это, чтобы просто использовать csvtool. У меня были другие случаи использования, а также для использования csvtool и он может обрабатывать кавычки или разделители надлежащим образом, если они появляются в себе данные колонки.

csvtool format '%(2)\n' input.csv

Замена 2 с номером столбца будет эффективно извлечь данные столбца, который вы ищете.

Комментарии (4)

Приземлился здесь хотите извлечь из вкладки отдельный файл. Думал, я хотел бы добавить.

cat textfile.tsv | cut -f2 -s

Где-Ф2` извлекает 2, ненулевой столбец индексируется, или второй колонке.

Комментарии (3)

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

FS (разделитель полей) - это переменная, значение которой dafaulted в пространство. Так как awk разбивает по умолчанию на место для любой линии.

Так с помощью ключевых слов begin (выполнить до ввода), мы можем установить в этом поле все, что мы хотим...

awk 'BEGIN {FS = ","}; {print $3}'

Приведенный выше код будет печатать 3-й столбец в CSV-файл.

Комментарии (1)

Других ответов хорошо работать, но раз уж ты спросил для решения с помощью оболочки Bash, вы можете сделать это:

AirBoxOmega:~ d$ cat > file #First we'll create a basic CSV
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10

А затем вы можете вытащить столбцы (первый в данном примере) следующим образом:

AirBoxOmega:~ d$ while IFS=, read -a csv_line;do echo "${csv_line[0]}";done < file
a
1
a
1
a
1
a
1
a
1
a
1

Так что там'ы несколько вещей происходит здесь:

  • при КСФ=,` - это высказывание используют запятую в качестве КСФ (внутренний разделитель полей), что Shell использует, чтобы знать то, что отделяет полей (текстовых блоков). Так сказать КСФ=, все равно что сказать "А,Б" это же как "Б" и будет, если КСФ=" не то " (что это по умолчанию.)

  • читай-csv_line; - это значит читать в каждой строке по одному, и создать массив, где каждый элемент получил название "csv_line" и отправить, что в "делать" в разделе нашего цикла while

  • делать Эхо "${csv_line[0]}" и;сделать < файл - теперь мы'вновь в "делать" и этап, и мы'вновь говорю, что эхо на 0-ой элемент массива "и csv_line-то". Это действие повторяется на каждой строке файла. В `< файл является просто говорю, а цикл, в котором, чтобы прочитать от. Примечание: помните, что в bash, массивы с 0 проиндексированных, так что первая колонка-это элемент 0-й.

Настолько там Вы имеете его, вытащив колонки из CSV в оболочке. Другие решения, возможно, более практичный, но это чисто Баш.

Комментарии (0)

Вы могли бы использовать GNU awk и, см. [Эта статья руководство пользователя][1]. В качестве улучшения к решению, представленные в статье (в июне 2015), следующую команду поглазеть позволяет двойные кавычки внутри двойных кавычках полей; двойная кавычка отмечены две подряд двойные кавычки (" и" В) нет. Кроме того, это позволяет пустые поля, но даже этого не может обрабатывать многострочные поля. Следующий пример печатает 3-й столбец (через с=3) из текстового файла.КШМ:


#!/bin/bash
gawk -- '
BEGIN{
    FPAT="([^,\"]*)|(\"((\"\")*[^\"]*)*\")"
}
{
    if (substr($c, 1, 1) == "\"") {
        $c = substr($c, 2, length($c) - 2) # Get the text within the two quotes
        gsub("\"\"", "\"", $c)  # Normalize double quotes
    }
    print $c
}
' c=3 < 
Комментарии (0)

[тупой@один ПТС]$ кот > файл #сначала мы'Лл создать базовый файл CSV А,B,С,D,Е,F,г,H,я,к 1,2,3,4,5,6,7,8,9,10 А,B,С,D,Е,F,г,H,я,к 1,2,3,4,5,6,7,8,9,10

[тупой@один оч]$ awk и -Ф '{печати $1}' файл а 1 а 1

Комментарии (0)

Мне нужен правильный CSV-файл парсинга, а не резать / в awk и молитве. Я'м пытаясь это на Mac без csvtool, но маки приходят с Рубином, так что вы можете сделать:

echo "require 'csv'; CSV.read('new.csv').each {|data| puts data[34]}" | ruby
Комментарии (0)
csvtool col 2 file.csv 

где 2-это столбец вас интересует

вы также можете сделать

csvtool col 1,2 file.csv 

чтобы сделать несколько столбцов

Комментарии (0)

Я думаю, самый простой это с помощью csvkit:

Получает 2-й столбец: csvcut -C файл 2.КШМ

Однако, там's также csvtool, и, вероятно, ряд других КШМ Баш инструменты там:

судо apt-получить установку csvtool (для Debian-based систем)

Это возвращает столбец с первой строки, имеющие 'ид' в это. csvtool namedcol идентификатор csv_file.КШМ

Это было возвращение четвертой строке: csvtool коль 4 csv_file.КШМ

Если вы хотите удалить строку заголовка:

csvtool коль 4 csv_file.КШМ | СЭД &#39;1д&#39;

Комментарии (0)

Вы можете'т сделать это без полного парсер CSV-файл.

Комментарии (1)

Мне интересно, почему ни один из ответов до сих пор упоминали csvkit.

csvkit представляет собой набор инструментов командной строки для преобразования и работы с КШМ

csvkit документации

Я использую его исключительно для управления КШМ данных и до сих пор я не нашел проблему, что я не мог решить, используя cvskit.

Чтобы извлечь один или более столбцов из файла CVS, можно использовать csvcut` утилита, которая является частью набора. Для извлечения второго столбца используйте эту команду:

csvcut -c 2 filename_in.csv > filename_out.csv 

ссылка на страницу csvcut

Если строки в CSV указаны, добавьте кавычки с Q, то вариант:

csvcut -q '"' -c 2 filename_in.csv > filename_out.csv 

Установить с пункт Установить csvkit " или " судо АПТ установить csvkit`.

Комментарии (0)

Вот пример csv-файл с 2 столбцами

myTooth.csv

Date,Tooth
2017-01-25,wisdom
2017-02-19,canine
2017-02-24,canine
2017-02-28,wisdom

Чтобы получить первый столбец, используйте:

cut -d, -f1 myTooth.csv

F стоит на поле и D обозначает разделитель

Выполнения приведенной выше команды будет производить следующий результат.

Выход

Date
2017-01-25
2017-02-19
2017-02-24
2017-02-28

Чтобы получить только 2-й столбец:

cut -d, -f2 myTooth.csv

И вот результат Выход

Tooth
wisdom
canine
canine
wisdom
incisor

Другой вариант использования:

Ваш входной файл CSV содержит 10 столбцов, и вы хотите, чтобы столбцы с 2 по 5 и 8 столбцов, используя запятую в качестве разделителя и".

(смысл "в полях&я вырезал использует -Ф;), чтобы указать столбцы и-D (в смысле на "Ограничитель") смотрите, чтобы указать разделитель. Вам необходимо указать последний, потому что некоторые файлы могут содержать пробелы, табуляции или точкой с запятой для разделения столбцов.

cut -f 2-5,8 -d , myvalues.csv

распил-командной и вот еще несколько примеров:

SYNOPSIS
     cut -b list [-n] [file ...]
     cut -c list [file ...]
     cut -f list [-d delim] [-s] [file ...]
Комментарии (0)

Вы также можете использовать цикл while


IFS=,
while read name val; do
        echo "............................"

        echo Name: "$name"
done
Комментарии (0)

Использую этот код для некоторое время, это не на "быстрые" и если не считать, что "резать и вставлять из StackOverflow и".

Он использует ${##} и ${%%} операторы в цикле вместо "Если". Он требует 'подстраховаться' и 'умирать', и поддерживает только запятая, тире, и трубу сентября чаров (что's все мне нужно).

err()  { echo "${0##*/}: Error:" "$@" >&2; }
die()  { err "$@"; exit 1; }

# Return Nth field in a csv string, fields numbered starting with 1
csv_fldN() { fldN , "$1" "$2"; }

# Return Nth field in string of fields separated
# by SEP, fields numbered starting with 1
fldN() {
        local me="fldN: "
        local sep="$1"
        local fldnum="$2"
        local vals="$3"
        case "$sep" in
                -|,|\|) ;;
                *) die "$me: arg1 sep: unsupported separator '$sep'" ;;
        esac
        case "$fldnum" in
                [0-9]*) [ "$fldnum" -gt 0 ] || { err "$me: arg2 fldnum=$fldnum must be number greater or equal to 0."; return 1; } ;;
                *) { err "$me: arg2 fldnum=$fldnum must be number"; return 1;} ;;
        esac
        [ -z "$vals" ] && err "$me: missing arg2 vals: list of '$sep' separated values" && return 1
        fldnum=$(($fldnum - 1))
        while [ $fldnum -gt 0 ] ; do
                vals="${vals#*$sep}"
                fldnum=$(($fldnum - 1))
        done
        echo ${vals%%$sep*}
}

Пример:

$ CSVLINE="example,fields with whitespace,field3"
$ $ for fno in $(seq 3); do echo field$fno: $(csv_fldN $fno "$CSVLINE");  done
field1: example
field2: fields with whitespace
field3: field3
Комментарии (0)