Skip to content

emka.web.id

Menu
  • Home
  • Indeks Artikel
  • Tutorial
  • Tentang Kami
Menu

Cara Mengurai File CSV Dalam Skrip Bash Di Linux

Posted on March 02, 2022 by Syauqi Wiryahasana

Comma-separated values ​​alias CSV adalah data semi terstruktur yang menggunakan koma sebagai pembatas untuk memisahkan kata. Format file CSV sangat populer di kalangan profesional data karena mereka harus berurusan dengan banyak file CSV dan memprosesnya untuk menciptakan wawasan. Pada artikel ini, kita akan fokus pada cara mengurai file CSV dalam skrip shell Bash di Linux.

Di sebagian besar artikel ini, saya akan menggunakan alat awk dan sed untuk penguraian csv alih-alih menggabungkan perintah yang berbeda seperti grep, cut, tr , etc.

Utilitas awk mengurangi kerumitan pemipaan beberapa perintah atau menulis loop dengan logika untuk mengambil data. Sebagai gantinya, Anda dapat menulis kode satu baris di awk untuk melakukan job.
Contents
1. Mempersiapkan File CSV Untuk Diproses1.1. Ganti Sel Kosong1.2. Kapitalisasi Header1.3. Hapus Tanda Koma2. Cukup Cetak File CSV Di Terminal2.1. Perintah Kolom2.2. CSV Lihat Perintah2.3. Tabel Cantik Python3. Mengambil Data Dari File CSV3.1. Cetak Baris & Kolom Hitung3.2. Cetak Seluruh File CSV3.3. Cetak Hanya Header Dari File CSV3.4. Kecualikan Baris Header3.5. Cetak Kolom Tertentu3.6. Cetak Baris yang Sesuai dengan KondisiCatatan tentang CsvkitConclusion1. Mempersiapkan File CSV Untuk Diproses

File CSV Anda mungkin dihasilkan dari database, API, atau Anda mungkin telah menjalankan beberapa perintah dan mengonversi output untuk membatasi dalam format CSV. Dalam kasus apa pun, Anda harus menganalisis kumpulan data terlebih dahulu sebelum menjalankan logika di atasnya.

Sebagai praktik terbaik, Anda harus membersihkan kumpulan data sebelum menggunakannya. Mengapa kita harus membersihkan dataset? Mungkin ada situasi di mana akan ada nilai sel kosong atau tidak ada format yang tepat di header, kolom tambahan yang tidak diperlukan untuk pemrosesan, dan banyak lagi.

Saya menggunakan data CSV di bawah ini, yang saya ambil dari Kaggle untuk tujuan demonstrasi.
Player_Id, Player_Name,DOB,Batting_Hand,Bowling_Skill,Country 1,SC Ganguly,8-Jul-72,Left_Hand,Media lengan kanan, 2,BB McCullum,27-Sep-81,Tangan_Kanan,Media lengan kanan, 3,RT Ponting, 19-Des-74,Tangan_Kanan,Media lengan kanan, 4,DJ Hussey,15-Jul-77,Tangan_Kanan,Offbreak lengan kanan,Australia 5,Mohammad Hafeez,17-Oct-80,Offbreak lengan kanan,Pakistan 6,R Dravid,11-Jan-73,Offbreak lengan kanan,India 7,W Jaffer,16-Feb-78,Offbreak lengan kanan,India 8,V Kohli,5-Nov-88,Kanan- lengan medium,India 9,JH Kallis,16-Oct-75,Right-arm fast-medium,Afrika Selatan 10,CL White,18-Aug-83,Right_Hand,Legbreak googly,Australia 11,MV Boucher,3-Des -76,Tangan_Kanan,Sedang lengan kanan,Afrika Selatan 12,B Akhil,7-Oct-77,Tangan_Kanan,Tangan kanan sedang-cepat,India 13,AA Noffke,30-Apr-7 7,Tangan_Kanan,Sedang cepat lengan kanan,Australia 14,P Kumar,2-Oct-86,Tangan_Kanan,Sedang lengan kanan,India 15,Z Khan,7-Oct-78,Tangan_Kanan,Sedang cepat lengan kiri , India
1.1. Ganti Sel Kosong

Dalam beberapa kasus, file CSV tidak akan memiliki nilai apa pun di sel tertentu. Lihatlah tangkapan layar di bawah ini di mana ada beberapa sel kosong di antara kolom.

Saya akan selalu menggantinya dengan "NA" atau "Tidak Ada Nilai", jadi tidak akan ada sel kosong. Anda dapat menggunakan cuplikan awk berikut untuk mengganti sel kosong apa pun dengan nilai yang Anda inginkan. Dalam hal ini, saya mengganti sel kosong dengan "Tidak ada nilai".
awk 'BEGIN{FS=",";OFS=","} { for(i=1;i1' player.csv > player_cleaned.csv

Using awk, Anda harus mengarahkan ulang perubahan ke file baru. Sebagai gantinya, Anda dapat menggunakan 'sed' untuk mengubah perubahan langsung ke dalam file. Di sini U mengubah huruf besar menjadi huruf besar. Jika Anda ingin melakukan konversi huruf kecil, gunakan L.
$ sed -i -e '1 s/(.*)/U1/' player_cleaned.csv$ cat player_cleaned.csv
1.3. Hapus Tanda Koma

Berkas CSV Anda mungkin diberi tanda koma di bagian akhir. Untuk membersihkan bagian akhir koma, Anda dapat mengikuti metode di bawah ini.

Saya sengaja menambahkan tanda koma dari baris 7 hingga 11 di file data saya.

Untuk menghapus semua tanda koma, jalankan perintah sed berikut:
$ sed -i 's/,$/ /' ~/Documents/player_cleaned.csv

Sekarang kita selesai dengan bagian pembersihan. Mungkin ada beberapa langkah lagi yang diperlukan untuk Anda, tetapi itu tergantung pada bagaimana file CSV Anda disusun dan apa yang perlu dibersihkan.
2. Pra tty Cetak File CSV Di Terminal

Jika Anda mencoba menampilkan file CSV di terminal, maka ada beberapa opsi di mana Anda dapat mencetak file dalam format tabel yang akan memberi Anda keterbacaan yang lebih baik.
2.1. Perintah Kolom

Pendekatan pertama adalah menggunakan perintah kolom. Perintah kolom menerima pemisah yang diatur ke koma dan pembatas untuk membagi kolom yang diatur ke tab pada perintah di bawah ini. Anda juga dapat mengatur pembatas kustom Anda sendiri.
$ cat player_cleaned.csv | kolom -s, -t $ kolom -s, -t player_cleaned.csv
2.2. CSV Look Command

Csvlook adalah utilitas yang disertakan dengan paket csvkit. Tidak perlu menyetel pembatas seperti yang kita lakukan dengan kolom command.
$ cat player_cleaned.csv | csvlook$ csvlook player_cleaned.csv
2.3. Python Pretty Table

Jika Anda telah menginstal modul python prettytable, maka Anda dapat menjalankan one-liner berikut dan mengarahkan file CSV untuk menghasilkan table.
python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))) " < player_cleaned.csv

Anda juga dapat membuat alias untuk one-liner dan meneruskan nama file sebagai argumen.
$ alias ptable='python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))) "'
$ ptable < player_cleaned.csv
  1. Mengambil Data Dari File CSV2
    .1. Cetak Jumlah Baris & Kolom

    Untuk mendapatkan jumlah kolom dalam file CSV, jalankan perintah berikut. Di sini variabel NF mewakili jumlah bidang yang dipisahkan dengan koma sebagai delimiter.
$ awk -F, 'END{print NF}' player_cleaned.csv6

Untuk mendapatkan jumlah baris, jalankan perintah berikut. Di sini variabel NR mewakili record saat ini (yaitu) setiap baris dianggap sebagai satu record.
$ awk -F, 'END{print NR}' player_cleaned.csv16

Untuk melewati baris pertama (header) dan menghitung jumlah baris, jalankan perintah berikut.
$ awk -F, 'END{print NR-1}' player_cleaned.csv15
3.2. Cetak Seluruh File CSV

Ini cukup sederhana. Anda dapat menggunakan cat atau awk untuk mencetak seluruh file CSV.
$ cat player_cleaned.csv
$ awk '{print}' player_cleaned.csv
3.3. Cetak Hanya Header Dari File CSV

Mencetak header saja akan memberi Anda gambaran umum yang bagus tentang jenis data yang disimpan file CSV Anda. Anda dapat menggunakan perintah head atau awk untuk mengambil header saja.
$ head -n 1 player_cleaned.csv
$ awk 'NR==1' player_cleaned.csv PLAYER_ID,PLAYER_NAME,DOB,BATTING HAND,BOWLING SKILL,COUNTRY
3.4. Kecualikan Baris Header

Untuk mengecualikan baris header dan mencetak semua baris lainnya gunakan perintah awk. Variabel awk NR > 1 akan membuat baris pertama dilewati.
$ awk '(NR>1)' player_cleansed.csv

Sed juga dapat digunakan untuk mengecualikan baris pertama dan mencetak semua baris lainnya. Bendera 1d akan menghapus baris pertama dan mencetak semua baris lainnya ke stdout (Terminal).
$ sed 1d < player_cleaned.csv
3.5. Cetak Kolom Tertentu

Kita bisa menggunakan posisi kolom untuk mencetak seluruh kolom. Ada dua pendekatan untuk mencapai ini. Pendekatan pertama adalah menggunakan awk dan pendekatan kedua adalah menggunakan loop. Awk akan jauh lebih mudah untuk mengambil kolom.

Awk secara default membagi baris berdasarkan pembatas dan menyimpan nilai dalam $1, $2, $3, dll. Pembatas default untuk awk adalah spasi putih.

Lihat cuplikan di bawah ini di mana pemisah bidang(FS=",") dan pemisah bidang keluaran(OFS=",") disetel ke koma. Pernyataan cetak akan mencetak kolom pertama, kolom kedua, dan kolom keenam.
awk 'BEGIN{FS=",";OFS=","} { print $1,$2,$6 }' player_cleansed.csv

Anda dapat menulis cuplikan di atas di one-liner too.
awk 'BEGIN{FS=",";OFS=","}{print $1,$2,$6}' player_cleansed.csv

Sekarang pendekatan kedua adalah menggunakan loops.
IFS="," saat membaca - r -a field do echo ${fields[0]},${fields[1]},${fields[5]} done < player_cleaned.csv

Biarkan saya menjelaskan apa yang sebenarnya terjadi ketika Anda menjalankan snippet.
di atasKami sedang menyetel Pemisah bidang internal IFS ke koma. Dengan menggunakan perintah baca, kami membuat larik bernama "bidang" dan mengarahkan file input ke loop while. Untuk setiap iterasi, ia akan membaca baris demi baris dan menyimpan baris sebagai elemen larik di "bidang " sehingga Anda dapat menggunakan posisi indeks array untuk mengambil kolom tertentu saja. Catatan: Nilai indeks dimulai dari 0..N
3.6. Cetak Baris yang Sesuai dengan Kondisi

Jika Anda ingin mencetak baris yang sesuai dengan kondisi tertentu, Anda dapat melakukannya dengan mudah menggunakan awk. Mari kita membahas beberapa skenario.

Untuk mencetak semua baris yang cocok dengan nilai dalam kolom, jalankan perintah berikut. Disini saya mencoba untuk mencetak semua baris yang cocok dengan nilai "India" di kolom 6.
$ awk -F , '$6 == "India"' player_cleaned.csv

Untuk mencetak semua baris yang tidak cocok dengan nilai tertentu, jalankan perintah berikut memerintah. Alih-alih operator kesetaraan, kami menggunakan operator yang tidak sama.
$ awk -F , '$6 != "India"' player_cleaned.csv

Anda juga dapat melakukan pemeriksaan kondisi pada lebih dari satu kolom menggunakan operator logika AND, logika OR. Katakanlah saya ingin memeriksa semua baris yang memiliki negara sebagai "India" dan tangan pemukul sebagai "Right_hand".

Di sini, $4 menunjuk ke kolom ke-4 dan $6 menunjuk ke kolom ke-6. Simbol && digunakan sebagai operator AND logis untuk mengevaluasi dua kondisi.
$ awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv

Jika Anda ingin menyertakan header bersama dengan hasil dari pemeriksaan bersyarat, gunakan perintah berikut. Pertama saya mencetak baris pertama menggunakan NR==1, kemudian menggunakan operator logika AND yang menjalankan pemeriksaan bersyarat untuk mencetak hasil.
$ awk 'NR==1' player_cleaned.csv && awk -F , '$4 == " Right_Hand" && $6 == "India"' player_cleaned.csv

Jika Anda ingin mencetak atau mengarahkan output, jalankan seluruh perintah di dalam subkulit dengan melampirkannya dengan tanda kurung.
$ (awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Tangan_Kanan" && $6 == "India"' player_cleaned.csv) | kolom -t -s,
Catatan tentang Csvkit

Sejauh ini, apa pun yang kita lihat dalam artikel ini sederhana dan mudah. Tetapi ketika file CSV Anda memiliki struktur yang kompleks, maka akan menjadi membosankan untuk diurai menggunakan pendekatan di atas. Ada utilitas bernama CSVKIT, yang merupakan utilitas luar biasa untuk bekerja dengan file CSV di bash.

Masalah dengan utilitas csvkit adalah ia diinstal secara default di distribusi Anda dan Anda mungkin harus menginstalnya secara manual. Di lingkungan perusahaan Anda, ini mungkin tidak dapat dilakukan karena mungkin ada beberapa batasan untuk menginstal paket eksternal. Tetapi utilitas ini layak disebutkan dan kami akan membuat artikel terperinci terpisah untuk itu.
Conclusion

Dalam panduan ini, kita telah melihat cara bekerja dengan file CSV menggunakan awk, sed. Anda juga dapat menggunakan utilitas lain seperti cut, grep, tr, dll untuk mendapatkan hasil yang diinginkan tetapi awk dan sed akan membuat hidup Anda lebih sederhana dan mengurangi kerumitan penulisan banyak kode. Jika Anda memiliki umpan balik, sebutkan di bagian komentar dan kami akan senang mendengarnya dari Anda.

Similar Baca:
Bash Scripting – Parse Argumen Dalam Bash Scripts Menggunakan getoptsCara Mengurai Dan Mencetak JSON Dengan Alat Baris Perintah Linux
Seedbacklink

Recent Posts

TENTANG EMKA.WEB>ID

EMKA.WEB.ID adalah blog seputar teknologi informasi, edukasi dan ke-NU-an yang hadir sejak tahun 2011. Kontak: kontak@emka.web.id.

©2024 emka.web.id Proudly powered by wpStatically