Anda dapat menambahkan kutipan dengan sed lalu gabungkan baris dengan tempel , seperti itu:
sed 's/^\|$/"/g'|paste -sd, -
Jika Anda menjalankan sistem berbasis GNU coreutils (yaitu Linux), Anda dapat menghilangkan '-'
di belakangnya .
Jika Anda memasukkan data dengan akhiran gaya DOS (seperti yang disarankan @phk), Anda dapat memodifikasi perintah sebagai berikut:
sed 's/\r//;s/^\|$/"/g'|paste -sd, -
Menggunakan
awk
:awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
Alternatif dengan pelepasan shell yang lebih sedikit sehingga lebih mudah dibaca:awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
Keluaran:'d3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
Penjelasan:
awk
skrip itu sendiri tanpa semua pelolosan adalah BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }
. Setelah mencetak entri pertama, variabel p
disetel (sebelumnya seperti string kosong). Dengan variabel ini p
setiap entri (atau di awk
-bicara:rekam ) diawali dan juga dicetak dengan tanda kutip tunggal di sekitarnya. awk
variabel pemisah catatan keluaran ORS
tidak diperlukan (karena prefiks melakukannya untuk Anda) sehingga disetel kosong pada BEGIN
ing. Oh dan kami mungkin file kami ke END
dengan baris baru (mis. sehingga berfungsi dengan alat pemrosesan teks lebih lanjut); seharusnya ini tidak diperlukan bagian dengan END
dan semua yang mengikutinya (di dalam tanda kutip tunggal) dapat dihapus.
Jika Anda memiliki akhiran gaya Windows/DOS (\r\n
), Anda harus mengonversinya ke gaya UNIX (\n
) pertama. Untuk melakukan ini, Anda dapat meletakkan tr -d '\015'
di awal alur Anda:
tr -d '\015' < /path/to/input.list | awk […] > /path/to/output
(Dengan asumsi Anda tidak menggunakan \r
s di file Anda. Asumsi yang sangat aman di sini.)
Atau, cukup jalankan dos2unix /path/to/input.list
sekali untuk mengonversi file di tempat.
Seperti yang ditunjukkan oleh jawaban tertaut @don_crissti, opsi tempel berbatasan dengan sangat cepat - perpipaan kernel linux lebih efisien daripada yang saya yakini jika saya tidak mencobanya sekarang. Hebatnya, jika Anda puas dengan satu koma yang memisahkan item daftar Anda daripada koma+spasi, saluran tempel
(paste -d\' /dev/null - /dev/null | paste -sd, -) <input
lebih cepat daripada flex
yang wajar program(!)
%option 8bit main fast
%%
.* { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }
Tetapi jika kinerja yang layak dapat diterima (dan jika Anda tidak menjalankan tes stres, Anda tidak akan dapat mengukur perbedaan faktor konstan, semuanya instan) dan Anda menginginkan fleksibilitas dengan pemisah Anda dan yang masuk akal -liner-y-ness,
sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'
adalah tiket Anda. Ya, ini terlihat seperti derau garis, tetapi H;1h;$!d;x
idiom adalah cara yang tepat untuk menyeruput semuanya, setelah Anda menyadari bahwa semuanya menjadi sangat mudah dibaca, itu adalah s/.*/'&'/
diikuti dengan slurp dan s/\n/, /g
.
sunting:berbatasan dengan yang absurd, cukup mudah untuk mendapatkan kelenturan untuk mengalahkan segala sesuatu yang kosong, cukup beri tahu stdio bahwa Anda tidak memerlukan sinkronisasi multithread/signalhandler bawaan:
%option 8bit main fast
%%
.+ { putchar_unlocked('\'');
fwrite_unlocked(yytext,yyleng,1,stdout);
putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }
dan di bawah tekanan itu 2-3x lebih cepat daripada pipeline pasta, yang setidaknya 5x lebih cepat daripada yang lainnya.