de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 user788171
user788171
Question

Cara mengekstrak satu kolom dari file csv

Jika saya memiliki file csv, ada bash cepat cara untuk mencetak isi dari hanya salah satu kolom? Ini adalah aman untuk mengasumsikan bahwa setiap baris memiliki jumlah kolom yang sama, tetapi masing-masing kolom's konten akan memiliki panjang yang berbeda.

95 2013-10-26T02:32:40+00:00 16
 jww
jww
Pertanyaan edit 10 Mei 2018 в 9:57
Pemrograman
csv
bash
extract
Solution / Answer
 synthesizerpatel
synthesizerpatel
26 Oktober 2013 в 2:34
2013-10-26T02:34:38+00:00
Lebih
Sumber
Sunting
#22625975

Anda bisa menggunakan awk untuk ini. Perubahan '$2' untuk kesekian kolom yang anda inginkan.

awk -F "\"*,\"*" '{print $2}' textfile.csv
110
0
 madrag
madrag
26 Oktober 2013 в 2:37
2013-10-26T02:37:17+00:00
Lebih
Sumber
Sunting
#22625976

ya. cat mycsv.csv | cut-d ',' -f3 akan mencetak 3 kolom.

77
0
 Samar
Samar
25 Oktober 2016 в 6:36
2016-10-25T18:36:58+00:00
Lebih
Sumber
Sunting
#22625983

Cara paling mudah saya bisa mendapatkan ini dilakukan adalah untuk hanya menggunakan csvtool. Saya punya kasus penggunaan lainnya juga untuk menggunakan csvtool dan dapat menangani kutipan atau pembatas tepat jika mereka muncul dalam kolom data itu sendiri.

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

Mengganti 2 dengan jumlah kolom akan secara efektif ekstrak data kolom yang anda cari.

36
0
 cevaris
cevaris
18 April 2014 в 8:28
2014-04-18T20:28:33+00:00
Lebih
Sumber
Sunting
#22625978

Mendarat di sini mencari untuk mengekstrak dari tab file dipisahkan. Pikir saya akan menambahkan.

cat textfile.tsv | cut -f2 -s

Di mana -f2 ekstrak 2, kamar non-nol diindeks kolom, atau kolom kedua.

13
0
 router
router
16 Desember 2015 в 2:59
2015-12-16T02:59:53+00:00
Lebih
Sumber
Sunting
#22625981

Banyak jawaban untuk pertanyaan ini adalah besar dan beberapa bahkan melihat ke sudut kasus. Saya ingin menambahkan jawaban sederhana yang dapat digunakan sehari-hari... di mana sebagian besar anda bisa menjadi orang-orang corner kasus (seperti setelah lolos koma atau koma dalam kutipan dll.,).

FS (Field Separator) adalah variabel yang nilainya dafaulted untuk ruang. Jadi awk secara default perpecahan di ruang untuk setiap baris.

Jadi menggunakan BEGIN (Mengeksekusi sebelum mengambil input) kita dapat mengatur bidang ini untuk apa pun yang kita inginkan...

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

Kode di atas akan mencetak 3 kolom di file csv.

6
0
 drldcsta
drldcsta
26 Oktober 2013 в 5:29
2013-10-26T05:29:27+00:00
Lebih
Sumber
Sunting
#22625977

Dengan jawaban yang lain bekerja dengan baik, tetapi karena anda diminta untuk solusi hanya menggunakan bash shell, anda dapat melakukan ini:

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

Dan kemudian anda dapat menarik keluar kolom (pertama dalam contoh ini) seperti:

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

Jadi ada's beberapa hal yang terjadi di sini:

  • sementara IFS=, - ini mengatakan untuk menggunakan koma sebagai IFS (Internal Field Separator), yang adalah apa yang shell menggunakan untuk tahu apa yang memisahkan bidang (blok teks). Jadi mengatakan IFS=, seperti mengatakan "b" adalah sama dengan "b" akan jika IFS=" " (yang ini apa yang itu adalah secara default.)

  • baca-csv_line; - ini mengatakan baca di setiap baris, satu pada satu waktu dan membuat array di mana masing-masing elemen ini disebut "csv_line" dan mengirim bahwa untuk "tidak" bagian dari while loop

  • echo "${csv_line[0]";selesai < file - sekarang kita're di "tidak" fase, dan kami're mengatakan echo elemen 0 array "csv_line". Tindakan ini diulang pada setiap baris dari file. The < file bagian ini hanya menceritakan sementara lingkaran di mana untuk membaca dari. CATATAN: ingat, di bash, array adalah 0 diindeks, sehingga kolom pertama adalah elemen 0.

Jadi di sana anda memilikinya, menarik keluar sebuah kolom dari sebuah CSV in the shell. Solusi lain yang mungkin lebih praktis, tapi yang satu ini adalah murni bash.

5
0
 jarno
jarno
6 Juni 2015 в 5:33
2015-06-06T17:33:45+00:00
Lebih
Sumber
Sunting
#22625979

Anda bisa menggunakan GNU Awk, lihat artikel ini dari user guide. Sebagai perbaikan untuk solusi yang disajikan dalam artikel (juni 2015), berikut melongo perintah yang memungkinkan tanda kutip ganda dalam dua dikutip sawah; double quote ditandai dengan dua tanda kutip ganda ("") ada. Selain itu, hal ini memungkinkan bidang-bidang kosong, tapi ini bahkan tidak bisa menangani multiline bidang. Berikut contoh cetakan ke-3 kolom (via c=3) dari textfile.csv:

#!/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 < <(dos2unix <textfile.csv)

Perhatikan penggunaan dos2unix untuk mengkonversi mungkin DOS style line breaks (CRLF yaitu "\r\n") dan encoding UTF-16 (dengan byte order mark) untuk "\n" dan UTF-8 (tanpa byte order mark), masing-masing. Standar file CSV menggunakan CRLF sebagai garis istirahat, lihat Wikipedia.

Jika input mungkin berisi multiline bidang, anda dapat menggunakan script berikut. Perhatikan penggunaan string khusus untuk memisahkan catatan dalam output (karena default pemisah newline bisa terjadi dalam sebuah catatan). Lagi-lagi, berikut ini contoh cetakan ke-3 kolom (via c=3) dari textfile.csv:

#!/bin/bash
gawk -- '
BEGIN{
    RS="\0" # Read the whole input file as one record;
    # assume there is no null character in input.
    FS="" # Suppose this setting eases internal splitting work.
    ORS="\n####\n" # Use a special output separator to show borders of a record.
}
{
    nof=patsplit($0, a, /([^,"\n]*)|("(("")*[^"]*)*")/, seps)
    field=0;
    for (i=1; i<=nof; i++){
        field++
        if (field==c) {
            if (substr(a[i], 1, 1) == "\"") {
                a[i] = substr(a[i], 2, length(a[i]) - 2) # Get the text within 
                # the two quotes.
                gsub(/""/, "\"", a[i])  # Normalize double quotes.
            }
            print a[i]
        }
        if (seps[i]!=",") field=0
    }
}
' c=3 < <(dos2unix <textfile.csv)

Ada pendekatan lain untuk masalah ini. csvquote dapat menampilkan isi dari file CSV dimodifikasi sehingga karakter khusus dalam bidang yang berubah sehingga biasa Unix teks pengolahan alat-alat yang dapat digunakan untuk memilih kolom tertentu. Untuk contoh kode berikut output kolom ketiga:

csvquote textfile.csv | cut -d ',' -f 3 | csvquote -u

csvquote dapat digunakan untuk proses sewenang-wenang file besar.

 jarno
jarno
Jawaban edit 19 November 2017 в 8:51
5
0
Raj Velayudhan
Raj Velayudhan
14 Maret 2016 в 9:53
2016-03-14T21:53:43+00:00
Lebih
Sumber
Sunting
#22625982

[[email protected] pts]$ cat > file #Pertama kita'll membuat dasar 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

[[email protected] pts]$ awk -F , '{print $1}' file a Satu a Satu

4
0
Darth Egregious
Darth Egregious
18 Januari 2018 в 8:58
2018-01-18T20:58:30+00:00
Lebih
Sumber
Sunting
#22625985

Aku butuh yang tepat CSV parsing, tidak cut / awk dan doa. I'm mencoba ini di mac tanpa csvtool, tapi mac tidak datang dengan ruby, sehingga anda dapat melakukan:

echo "require 'csv'; CSV.read('new.csv').each {|data| puts data[34]}" | ruby
Darth Egregious
Darth Egregious
Jawaban edit 23 Februari 2018 в 3:07
3
0
 exussum
exussum
4 September 2018 в 9:08
2018-09-04T09:08:46+00:00
Lebih
Sumber
Sunting
#22625986
csvtool col 2 file.csv 

di mana 2 adalah kolom yang anda tertarik

anda juga dapat melakukan

csvtool col 1,2 file.csv 

untuk melakukan beberapa kolom

2
0
 wordsforthewise
wordsforthewise
15 Agustus 2019 в 1:11
2019-08-15T01:11:46+00:00
Lebih
Sumber
Sunting
#22625990

Saya pikir yang paling mudah adalah dengan menggunakan csvkit:

Mendapat 2 kolom: csvcut -c 2 file.csv

Namun, ada's juga csvtool, dan mungkin sejumlah lainnya csv bash alat-alat di luar sana:

sudo apt-get install csvtool (untuk Debian berbasis sistem)

Ini akan kembali kolom dengan baris pertama memiliki 'ID' di dalamnya. csvtool namedcol ID csv_file.csv

Ini akan mengembalikan baris keempat: csvtool col 4 csv_file.csv

Jika anda ingin drop baris header:

csvtool col 4 csv_file.csv | sed &#39;1d&#39;

 wordsforthewise
wordsforthewise
Jawaban edit 15 Agustus 2019 в 1:39
1
0
Peter Krumins
Peter Krumins
26 Desember 2016 в 1:22
2016-12-26T01:22:23+00:00
Lebih
Sumber
Sunting
#22625984

Anda dapat't melakukan itu tanpa penuh CSV parser.

1
0
 Soundbytes
Soundbytes
13 Desember 2018 в 3:38
2018-12-13T15:38:10+00:00
Lebih
Sumber
Sunting
#22625987

Aku bertanya-tanya mengapa tidak ada jawaban yang sejauh ini telah disebutkan csvkit.

csvkit adalah sebuah suite alat-alat baris perintah untuk mengkonversi ke dan bekerja dengan CSV

csvkit dokumentasi

Saya menggunakannya secara eksklusif untuk data csv manajemen dan sejauh ini saya belum menemukan masalah yang saya tidak bisa memecahkan menggunakan cvskit.

Untuk ekstrak satu atau lebih kolom dari cvs file, anda dapat menggunakan csvcut utilitas yang merupakan bagian dari toolbox. Untuk mengekstrak kolom kedua menggunakan perintah ini:

csvcut -c 2 filename_in.csv > filename_out.csv 

csvcut referensi halaman

Jika string di csv yang dikutip, tambahkan kutipan karakter dengan q pilihan:

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

Install dengan pip menginstal csvkit atau sudo apt-get install csvkit.

 Suzana
Suzana
Jawaban edit 22 Mei 2019 в 8:04
1
0
 Stryker
Stryker
17 Februari 2019 в 5:17
2019-02-17T17:17:54+00:00
Lebih
Sumber
Sunting
#22625988

Berikut ini adalah file csv contoh dengan 2 kolom

myTooth.csv

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

Untuk mendapatkan kolom pertama, gunakan:

cut -d, -f1 myTooth.csv

f singkatan dari Lapangan dan d adalah singkatan dari pembatas

Menjalankan perintah di atas akan menghasilkan output sebagai berikut.

Output

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

Untuk mendapatkan kolom ke-2 saja:

cut -d, -f2 myTooth.csv

Dan di sini adalah output Output

Tooth
wisdom
canine
canine
wisdom
incisor

Use case lain:

Anda csv file input yang berisi 10 kolom dan anda ingin kolom 2 sampai 5 dan kolom 8, menggunakan koma sebagai pemisah".

potong menggunakan -f (arti "bidang") untuk menentukan kolom dan -d (yang berarti "pembatas") untuk menentukan pemisah. Anda perlu menentukan terakhir karena beberapa file mungkin menggunakan spasi, tab, atau titik dua untuk kolom yang terpisah.

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

cut adalah perintah utilitas dan berikut adalah beberapa contoh:

SYNOPSIS
     cut -b list [-n] [file ...]
     cut -c list [file ...]
     cut -f list [-d delim] [-s] [file ...]
 Stryker
Stryker
Jawaban edit 17 Februari 2019 в 7:46
1
0
 K.Sopheak
K.Sopheak
13 Maret 2019 в 6:08
2019-03-13T06:08:46+00:00
Lebih
Sumber
Sunting
#22625989

Anda juga dapat menggunakan while loop

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

        echo Name: "$name"
done<itemlst.csv
0
0
 qneill
qneill
8 Desember 2015 в 3:19
2015-12-08T15:19:32+00:00
Lebih
Sumber
Sunting
#22625980

Menggunakan kode ini untuk sementara, hal ini tidak "cepat" kecuali jika anda menghitung "memotong dan paste dari stackoverflow".

Menggunakan ${##} dan ${%%} operator di lingkaran bukan IFS. Itu panggilan 'err' dan 'mati', dan hanya mendukung koma, dash, dan pipa sebagai SEP karakter (yang's semua yang saya butuhkan).

err()  { echo "${0##*/}: Error:" "[email protected]" >&2; }
die()  { err "[email protected]"; 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*}
}

Contoh:

$ 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
 qneill
qneill
Jawaban edit 8 Desember 2015 в 3:27
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 2 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi