GNU/Linux >> Belajar Linux >  >> Linux

Mengubah baris terpisah menjadi daftar yang dipisahkan koma dengan entri yang dikutip

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.

Catatan

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.


Linux
  1. Sisipkan Baris Baru Dengan Nilai yang Hilang (na)?

  2. Melanggar Output Menjadi Baris Baru?

  3. Bagaimana Mendapatkan Ls Untuk Mencantumkan Direktori Dengan Trailing Forward-slash?

  1. Cara membuat daftar domain dengan DNSSEC

  2. Go For It – Daftar Pekerjaan Modern dengan Pengatur Waktu

  3. Rekatkan dua daftar teks (satu daftar file) ke dalam satu daftar yang dipisahkan oleh titik koma

  1. Bagaimana cara menggabungkan beberapa baris nama file menjadi satu dengan pembatas khusus?

  2. Menggunakan daftar pengguna yang diizinkan dengan VSFTPD

  3. Cara mengurangi baris (baris) dengan AWK