Mengganti garis bawah dengan koma dan menghapus tanda kutip ganda di CSV

10

Saya memiliki file CSV sebagai

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. dan seterusnya.

Saya perlu mengkonversi file CSV ini menjadi

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
RKR
sumber

Jawaban:

24

Cara yang jauh lebih sederhana adalah menggunakan tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Cara kerjanya adalah trmembutuhkan dua argumen - set karakter untuk diganti, dan penggantiannya. Dalam hal ini kami hanya memiliki set 1 karakter. Kami mengarahkan aliran stdin input.csvinput trmelalui <operator shell, dan menyalurkan output yang dihasilkan ke tr -d '"'untuk menghapus tanda kutip ganda.

Tetapi awkbisa melakukannya juga.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Cara kerjanya sedikit berbeda: awk membaca setiap file baris demi baris, setiap skrip in-line menjadi /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Di sini kita tidak memiliki pola, jadi itu berarti mengeksekusi kode kunci untuk setiap baris. gsub()fungsi digunakan untuk substitusi global dalam satu baris, jadi kami menggunakannya untuk mengganti garis bawah dengan koma, dan tanda kutip ganda dengan string nol (secara efektif menghapus karakter). Ada 1di tempat pencocokan pola dengan blok kode yang hilang, yang secara default hanya untuk mencetak baris; dengan kata lain kode kunci dengan gsub()melakukan pekerjaan dan 1mencetak hasilnya.

Gunakan pengalihan shell ( >) untuk mengirim output ke file baru:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
Sergiy Kolodyazhnyy
sumber
Permintaan maaf. Saya juga ingin menghapus koma terbalik juga. Saya memperbarui pertanyaan
RKR
@RKR Jawaban diperbarui sesuai, jawaban Ian juga diperbarui
Sergiy Kolodyazhnyy
13

Sama seperti alternatif, Anda juga dapat menggunakan sedperintah ini :

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
IanC
sumber
1
Dalam kutipan tunggal, Anda tidak perlu melarikan diri dari penawaran ganda.
glenn jackman
Memang @glennjackman! Saya baru saja menghapus backslash yang melarikan diri
IanC
10

Perl, "gergaji tentara Swiss" dari pemrosesan teks baris perintah, juga dapat melakukan ini. Sintaksnya (tidak secara kebetulan) sangat mirip dengan trdan sedcontoh:

perl -pe 'tr/_"/,/d' input.csv > result.csv

atau:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Tapi jujur, jika Anda tidak ingin meluangkan waktu untuk mempelajari bahasa pemrograman baru (yang benar-benar awk, Perl dan sed dan alat-alat lain seperti mereka) hanya untuk tugas dasar ini, Anda bisa melakukannya di editor teks apa pun yang mendukung pencarian dan ganti:

  1. Buka file CSV di editor teks favorit Anda (seperti gedit, kate, mousepad, dll.; Bahkan Notepad atau Wordpad lama yang biasa di Windows dapat melakukan ini).

  2. Pilih "Cari dan Ganti" dari menu (biasanya ditemukan di bawah "Edit", jika tidak ada menu "Cari" yang terpisah).

  3. Masukkan _ke dalam kotak pencarian, dan ,ke dalam kotak pengganti.

  4. Klik "Ganti Semua".

  5. Ulangi dengan "di kotak pencarian dan tidak ada di kotak pengganti.

  6. Simpan file.

Sekarang, jika Anda perlu melakukan ini untuk 100 atau 1000 file, bukan hanya satu, maka mempelajari alat baris perintah baru mulai masuk akal. Dan, tentu saja, setelah Anda tahu cara menggunakan Perl atau sed atau apa pun, maka Anda akan menghemat banyak waktu dan upaya dengan tugas serupa nanti. Tetapi untuk pekerjaan sekali saja yang tidak Anda harapkan perlu dilakukan lagi, terkadang alat interaktif dasar seperti editor teks adalah solusi paling sederhana.

Ilmari Karonen
sumber
3

Anda bisa melakukan ini vimjuga.

Buka file:, vim input.csvlalu gunakan vimalat pencarian lanjutan s. Ketik titik dua ( :) untuk masuk ke mode perintah, dan jalankan perintah seperti ini:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Cukup banyak perintah yang sama seperti dalam jawaban IanC, tetapi di dalam vimdaripada menggunakan sed.

Tanda tanya
sumber
2

Mengapa tidak hanya mengubah nilai default input dan output nilai Separator

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
antuan sehikyan
sumber