GNU/Linux >> Belajar Linux >  >> Linux

Cara Mengurai File CSV Dalam Skrip Bash Di Linux

Nilai yang dipisahkan koma 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, kami akan berfokus pada cara mengurai file CSV dalam skrip shell Bash di Linux.

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

awk utilitas 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 pekerjaan.

1. 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 Anda di atasnya.

Sebagai praktik terbaik, Anda harus membersihkan set data Anda sebelum menggunakannya. Mengapa kita harus membersihkan dataset? Mungkin ada situasi di mana akan ada nilai sel kosong atau tidak ada pemformatan 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,Right-arm medium,
2,BB McCullum,27-Sep-81,Right_Hand,Right-arm medium,
3,RT Ponting,19-Dec-74,Right_Hand,Right-arm medium,
4,DJ Hussey,15-Jul-77,Right_Hand,Right-arm offbreak,Australia
5,Mohammad Hafeez,17-Oct-80,,Right-arm offbreak,Pakistan
6,R Dravid,11-Jan-73,,Right-arm offbreak,India
7,W Jaffer,16-Feb-78,,Right-arm offbreak,India
8,V Kohli,5-Nov-88,,Right-arm medium,India
9,JH Kallis,16-Oct-75,,Right-arm fast-medium,South Africa
10,CL White,18-Aug-83,Right_Hand,Legbreak googly,Australia
11,MV Boucher,3-Dec-76,Right_Hand,Right-arm medium,South Africa
12,B Akhil,7-Oct-77,Right_Hand,Right-arm medium-fast,India
13,AA Noffke,30-Apr-77,Right_Hand,Right-arm fast-medium,Australia
14,P Kumar,2-Oct-86,Right_Hand,Right-arm medium,India
15,Z Khan,7-Oct-78,Right_Hand,Left-arm fast-medium,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 "No Value", jadi tidak akan ada sel kosong. Anda dapat menggunakan awk berikut ini snippet 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;i<=NF;i++)
      {
        if($i == ""){
         $i="No Value"
        }
      }
      print
    }' ~/Downloads/Player.csv > player_cleaned.csv

Cara kerja cuplikan ini adalah saya menyetel pemisah bidang dan pemisah bidang keluaran ke koma (FS=",";OFS="," ). Menggunakan for loop , ulangi setiap sel dalam satu baris, dan jika sel ditemukan kosong ($i == "" ) lalu ganti dengan "No value" ($i="No value" ). Anda harus mengarahkan perubahan ke file baru.

Bacaan yang Disarankan:

  • Pengalihan Bash Dijelaskan Dengan Contoh

1.2. Kapitalisasi Header

File CSV mungkin memiliki header atau tidak. Tetapi jika ada tajuk, saya akan selalu menggunakan huruf besar untuk keterbacaan yang lebih baik. Anda dapat melakukannya dengan mudah menggunakan awk atau sed . Saya akan menunjukkan kepada Anda keduanya.

awk 'BEGIN{FS=",";OFS=","}
    {
        if(NR==1){
            print toupper($0)
        } else {
            print
        }
    }' player.csv > player_cleaned.csv

Di sini, kami memeriksa apakah baris tersebut adalah baris pertama menggunakan(NR==1 ) dan menggunakan toupper() berfungsi untuk mengkapitalisasinya. Cuplikan yang sama dapat ditulis sebagai satu baris.

awk 'NR==1{ print toupper($0) }NR>1' player.csv > player_cleaned.csv

Menggunakan 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 kasus menjadi huruf besar. Jika Anda ingin melakukan konversi huruf kecil, gunakan \L .

$ sed -i -e '1 s/(.*)/\U\1/' player_cleaned.csv
$ cat player_cleaned.csv

1.3. Hapus Tanda Koma

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

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

Untuk menghapus semua tanda koma, jalankan sed berikut ini perintah:

$ 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 struktur file CSV Anda dan apa yang perlu dibersihkan.

2. Cukup 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 dengan menggunakan column memerintah. 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 | column -s, -t
$ column -s, -t player_cleaned.csv

2.2. Perintah Tampilan CSV

Csvlook adalah utilitas yang disertakan dengan paket csvkit. Tidak perlu menyetel pembatas seperti yang kita lakukan dengan column perintah.

$ cat player_cleaned.csv | csvlook
$ csvlook player_cleaned.csv

2.3. Tabel Cantik Python

Jika Anda memiliki python cantik modul terinstal, maka Anda dapat menjalankan one-liner berikut dan mengarahkan ulang file CSV untuk membuat tabel.

python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))" < player_cleaned.csv

Anda juga dapat membuat alias untuk one-liner dan berikan nama file sebagai argumen.

$ alias ptable='python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))"'
$ ptable < player_cleaned.csv

3. Mengambil Data Dari File CSV

3.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 pembatas.

$ awk -F, 'END{print NF}' player_cleaned.csv
6

Untuk mendapatkan jumlah baris, jalankan perintah berikut. Di sini variabel NR mewakili catatan saat ini (yaitu) setiap baris dianggap sebagai satu catatan.

$ awk -F, 'END{print NR}' player_cleaned.csv
16

Untuk melewati baris pertama (tajuk) dan menghitung jumlah baris, jalankan perintah berikut.

$ awk -F, 'END{print NR-1}' player_cleaned.csv
15

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 tajuk saja akan memberi Anda gambaran umum yang bagus tentang jenis data yang disimpan oleh file CSV Anda. Anda dapat menggunakan head atau awk perintah 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 Tajuk

Untuk mengecualikan baris header dan mencetak semua baris lainnya gunakan awk memerintah. 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. 1d flag akan menghapus baris pertama dan mencetak semua baris lainnya ke stdout (Terminal).

$ sed 1d < player_cleaned.csv

3.5. Cetak Kolom Tertentu

Kita dapat 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 lebih mudah untuk mengambil kolom.

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

Lihatlah 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 juga dapat menulis cuplikan di atas dalam satu baris.

awk 'BEGIN{FS=",";OFS=","}{print $1,$2,$6}' player_cleansed.csv

Sekarang pendekatan kedua adalah menggunakan loop.

IFS="," 
while read -r -a fields
do
    echo ${fields[0]},${fields[1]},${fields[5]}
done < player_cleaned.csv

Biarkan saya menjelaskan apa yang sebenarnya terjadi ketika Anda menjalankan cuplikan di atas.

  • Kami menyetel IFS pemisah bidang internal ke koma.
  • Menggunakan perintah read kita membuat array bernama "fields" dan mengarahkan file input ke while loop .
  • Untuk setiap iterasi, ia akan membaca baris demi baris dan menyimpan baris sebagai elemen larik di "bidang" sehingga Anda dapat menggunakan posisi indeks larik untuk mengambil kolom tertentu saja.

Catatan: Nilai indeks dimulai dari 0..N

3.6. Cetak Baris Sesuai Kondisi

Jika Anda ingin mencetak baris yang sesuai dengan kondisi tertentu, Anda dapat melakukannya dengan mudah menggunakan awk . Mari 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" pada kolom 6.

$ awk -F , '$6 == "India"' player_cleaned.csv

Untuk mencetak semua baris yang tidak cocok dengan nilai tertentu, jalankan perintah berikut. 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 "Tangan_Kanan".

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 memasukkan 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 hasilnya.

$ awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv

Jika Anda ingin mencetak atau mengarahkan ulang output, jalankan seluruh perintah di dalam subkulit dengan mengapitnya dengan kurung .

$ (awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv) | column -t -s,

Catatan tentang Csvkit

Sejauh ini apa pun yang telah kita lihat dalam artikel ini sederhana dan lugas. 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 itu 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 yang terpisah untuk itu.

Kesimpulan

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 dengan senang hati mendengarnya dari Anda.

Bacaan Serupa:

  • Skrip Bash – Mengurai Argumen Dalam Skrip Bash Menggunakan getopts
  • Cara Mengurai Dan Mencetak JSON Dengan Alat Baris Perintah Linux

Linux
  1. Bagaimana Cara Mempersingkat Bash Prompt di Linux?

  2. Cara Membuat Zip Banyak File di Linux

  3. Bagaimana cara mengurai file CSV di Bash?

  1. Cara mengenkripsi file dengan gocryptfs di Linux

  2. Cara Mengganti Nama File di Linux

  3. Bagaimana cara menghapus banyak file sekaligus di Bash di Linux?

  1. Bagaimana saya menyesuaikan dekorasi jendela Linux saya

  2. Cara menemukan file di Linux

  3. Bagaimana BASH Shell memuat file konfigurasinya di Linux