Saya sedang mengerjakan skrip Bash yang panjang. Saya ingin membaca sel dari file CSV menjadi variabel Bash. Saya dapat mengurai baris dan kolom pertama, tetapi tidak dapat mengurai kolom lain. Inilah kode saya sejauh ini:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Ini hanya mencetak kolom pertama. Sebagai tes tambahan, saya mencoba yang berikut ini:
read -d, x y < <(echo a,b,)
Dan $ y kosong. Jadi saya mencoba:
read x y < <(echo a b)
Dan $ y adalah b
. Mengapa?
awk
menggunakan$1
,$2
, dll?Jawaban:
Anda perlu menggunakan
IFS
alih-alih-d
:Perhatikan bahwa untuk penguraian CSV tujuan umum, Anda harus menggunakan fitur khusus yang dapat menangani kolom kutipan dengan koma internal, di antara masalah lain yang tidak dapat ditangani Bash sendiri. Contoh alat tersebut adalah
cvstool
dancsvkit
.sumber
command not found
. Hanyaecho
pekerjaannya.;
:while IFS=";" read col1 col2; do ...
${var}
), tetapi saya menghilangkannya jika tidak diperlukan. Bagi saya, ini terlihat lebih bersih.Dari
man
halaman:Anda menggunakan
-d,
yang akan menghentikan baris input pada koma. Itu tidak akan membaca sisa baris. Itulah mengapa $ y kosong.sumber
Kita dapat mengurai file csv dengan string yang dikutip dan dibatasi oleh say | dengan kode berikut
awk mengurai bidang string ke variabel dan tr menghapus kutipan.
Sedikit lebih lambat karena awk dijalankan untuk setiap bidang.
sumber
Jika Anda ingin membaca file CSV dengan beberapa baris, maka ini solusinya.
sumber