Saya bekerja dengan .csv
output dari kueri data SE ini yang terlihat seperti ini (hanya dengan 5022 entri):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(Dan itu memiliki ^M
ujung garis antara [angka], dan "" judul ""). Saya perlu terlihat seperti ini:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Saya memperbaikinya dalam editor teks tertentu yang akan tetap tanpa nama dengan mudah, tetapi saya ingin membuat skrip sehingga saya tidak perlu melakukannya lagi setiap kali kueri disegarkan & agar orang lain dapat menggunakannya. Saya menggunakan sed
...
Rangkaian perintah ini bekerja dengan sempurna (meskipun mungkin tidak efisien; ini hanya solusi coba-coba):
# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew
Jadi, mengapa ini tidak dilakukan? Hanya ^M
dan {}
dihapus, dan segala sesuatu yang lain masih ada.
#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
s/{//
s/}//
s/""//g
s/^"//
/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/,\ /,/
s/\\//g
}' QueryNew
Saya yakin kesalahan saya sangat jelas ...
sumber
\r
.jq
putus pada baris pertama di mana bidang judul memiliki titik dua (baris pertama). Saya masih tidak yakin mengapased
membenci saya, tetapi saya membunuh beberapa kutipan dan\r
di baris ini/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
dan akhirnya berfungsi seperti ini . Terima kasih banyak ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
dilakukan & dilakukan seperti sulap)Saya memperbaikinya berkat steeldriver & mengutak-atik lebih lanjut. Tidak dimurnikan tetapi berfungsi.
terjemahan:
s/"{//
Hapus"{
s/}"//
Hapus}"
s/^"//
Hapus"
dari awal/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
pertandingan baris,\r
pada satu baris dan[whatever]title[whatever]:
pada baris berikutnya, ganti semua dengan,
s/""//g
Hapus semua tanda kutip ganda yang tersisas/^\s\+//
Hapus spasi putih dari awal baris/^\s*$/d
Hapus baris kosongs/^id:\ //
Hapusid:
dan spasi setelah itus/\\//g
Hapus garis miring terbalik (escape chars for "ditambahkan ke beberapa bidang judul)tee "$1"
tentukan sebuah file outfile saat menjalankan skrip, misalnya./queryclean newquery.csv
sumber
Sementara pertanyaan diajukan
sed
, orang dapat mengatasi masalah sed dengan Python:Kode ini kompatibel dengan python2 dan python3, jadi keduanya akan berfungsi
Contoh dijalankan:
sumber
Tiga pendekatan lagi:
awk
Perl
GNU grep dengan regex perl yang kompatibel dan perl sederhana:
sumber
Ini bukan menjawab pertanyaan Anda atau menyelesaikan masalah Anda, tetapi untuk menghilangkan karakter yang tidak diinginkan, Anda dapat menggunakan tr :
dan Anda akan mendapatkan:
sumber
tr
:)Ini adalah skrip lain yang ditulis dalam Ruby. Itu akan mempertahankan koma dalam judul, yang dapat dengan mudah diimpor ke program spreadsheet apa pun tanpa melanggar kolom.
Setelah program dijalankan, output yang dihasilkan akan terlihat seperti ini
sumber
:
di dalamnya?