Memiliki file CSV seperti ini:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
dan mencari hasil seperti:
HEADER
first, column|second "some random quotes" column|third ol' column
dengan kata lain menghapus "FOOTER", tanda kutip di awal, akhir dan sekitar |.
Sejauh ini kode ini berfungsi:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Seperti yang Anda lihat masalahnya adalah ia membuat 4 file tambahan.
Berikut adalah solusi lain, yang memiliki tujuan untuk tidak membuat file tambahan dan melakukan hal yang sama dalam satu skrip. Itu tidak bekerja dengan baik.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
tidak akan bekerja dengan itu, hanya dengan csv yang disederhanakan. Gunakan bahasa pemrograman dengan pustaka yang dapat menangani file CSV nyata (Python / Perl / Ruby).Jawaban:
Pertama-tama, seperti yang ditunjukkan Michael, Anda bisa menggabungkan semua ini menjadi satu perintah:
Saya pikir beberapa
sed
implementasi tidak dapat mengatasinya dan mungkin perlu:Yang mengatakan, sepertinya bidang Anda ditentukan oleh
|
dan Anda hanya ingin menghapus"
seluruh bidang, meninggalkan yang ada di dalam bidang. Dalam hal ini, Anda dapat melakukan:Atau, dengan GNU
sed
:Anda juga bisa menggunakan Perl:
sumber
Ini juga akan berfungsi:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Contoh:
versi cantik
sumber
FOOTER
, itu akan menghapus data yang diinginkan.