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
16
Anda bisa menggunakan awk untuk ini. Perubahan '$2' untuk kesekian kolom yang anda inginkan.
ya.
cat mycsv.csv | cut-d ',' -f3
akan mencetak 3 kolom.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.
Mengganti 2 dengan jumlah kolom akan secara efektif ekstrak data kolom yang anda cari.
Mendarat di sini mencari untuk mengekstrak dari tab file dipisahkan. Pikir saya akan menambahkan.
Di mana
-f2
ekstrak 2, kamar non-nol diindeks kolom, atau kolom kedua.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.,).
Jadi menggunakan BEGIN (Mengeksekusi sebelum mengambil input) kita dapat mengatur bidang ini untuk apa pun yang kita inginkan...
Kode di atas akan mencetak 3 kolom di file csv.
Dengan jawaban yang lain bekerja dengan baik, tetapi karena anda diminta untuk solusi hanya menggunakan bash shell, anda dapat melakukan ini:
Dan kemudian anda dapat menarik keluar kolom (pertama dalam contoh ini) seperti:
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 loopecho "${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.
Anda bisa menggunakan GNU Awk, lihat [artikel ini dari user guide][1]. 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:[bodoh@satu 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
[bodoh@satu pts]$ awk -F , '{print $1}' file a Satu a Satu
Aku butuh yang tepat CSV parsing, tidak
cut
/awk
dan doa. I'm mencoba ini di mac tanpacsvtool
, tapi mac tidak datang dengan ruby, sehingga anda dapat melakukan:di mana 2 adalah kolom yang anda tertarik
anda juga dapat melakukan
untuk melakukan beberapa kolom
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 '1d'
Anda dapat't melakukan itu tanpa penuh CSV parser.
Aku bertanya-tanya mengapa tidak ada jawaban yang sejauh ini telah disebutkan csvkit.
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 referensi halaman
Jika string di csv yang dikutip, tambahkan kutipan karakter dengan
q
pilihan:Install dengan
pip menginstal csvkit
atausudo apt-get install csvkit
.Berikut ini adalah file csv contoh dengan 2 kolom
Untuk mendapatkan kolom pertama, gunakan:
f singkatan dari Lapangan dan d adalah singkatan dari pembatas
Menjalankan perintah di atas akan menghasilkan output sebagai berikut.
Output
Untuk mendapatkan kolom ke-2 saja:
Dan di sini adalah output Output
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 adalah perintah utilitas dan berikut adalah beberapa contoh:
Anda juga dapat menggunakan while loop
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).
Contoh: