GNU/Linux >> Linux Esercitazione >  >> Linux

Trasformazione di righe separate in un elenco separato da virgole con voci tra virgolette

Puoi aggiungere virgolette con sed e poi unisci le righe con incolla , così:

sed 's/^\|$/"/g'|paste -sd, -

Se stai eseguendo un sistema basato su coreutils GNU (ad esempio Linux), puoi omettere il '-' finale .

Se i dati immessi hanno terminazioni di riga in stile DOS (come suggerito da @phk), puoi modificare il comando come segue:

sed 's/\r//;s/^\|$/"/g'|paste -sd, -

Usando awk :
awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
Alternativa con meno shell di escape e quindi più leggibile:
awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
Uscita:
'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
Spiegazione:

Il awk lo script stesso senza tutti gli escape è BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" } . Dopo aver stampato la prima voce la variabile p è impostato (prima è come una stringa vuota). Con questa variabile p ogni voce (o in awk -speak:registra ) è preceduto e inoltre stampato con virgolette singole attorno ad esso. Il awk output variabile separatore di record ORS non è necessario (poiché il prefisso lo sta facendo per te) quindi è impostato per essere vuoto al BEGIN ing. Oh, e potremmo portare il nostro file a END con una nuova riga (ad esempio, quindi funziona con altri strumenti di elaborazione del testo); se ciò non fosse necessario la parte con END e tutto ciò che segue (all'interno delle virgolette singole) può essere rimosso.

Nota

Se hai terminazioni di riga in stile Windows/DOS (\r\n ), devi convertirli in stile UNIX (\n ) primo. Per fare questo puoi inserire tr -d '\015' all'inizio della pipeline:

tr -d '\015' < /path/to/input.list | awk […] > /path/to/output

(Supponendo che tu non abbia alcuna utilità per \r è nel tuo file. Presupposto molto sicuro qui.)

In alternativa, esegui semplicemente dos2unix /path/to/input.list una volta per convertire il file sul posto.


Come mostra la risposta collegata di @don_crissti, l'opzione incolla rasenta l'incredibile velocità:il piping del kernel Linux è più efficiente di quanto avrei creduto se non l'avessi provato solo ora. Sorprendentemente, se puoi accontentarti di una singola virgola che separa gli elementi dell'elenco anziché di una virgola+spazio, una pipeline di incolla

(paste -d\' /dev/null - /dev/null | paste -sd, -) <input

è più veloce anche di un ragionevole flex programma(!)

%option 8bit main fast
%%
.*  { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }

Ma se solo prestazioni decenti sono accettabili (e se non stai eseguendo uno stress test, non sarai in grado di misurare alcuna differenza di fattore costante, sono tutte istantanee) e vuoi sia flessibilità con i tuoi separatori che ragionevole -liner-y-ness,

sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'

è il tuo biglietto Sì, sembra un rumore di linea, ma il H;1h;$!d;x l'idioma è il modo giusto per assorbire tutto, una volta che puoi riconoscere che l'intera cosa diventa davvero facile da leggere, è s/.*/'&'/ seguito da uno slurp e da un s/\n/, /g .

modifica:al limite dell'assurdo, è abbastanza facile ottenere flessibilità per battere tutto il resto vuoto, basta dire a stdio che non hai bisogno della sincronizzazione multithread/signalhandler incorporata:

%option 8bit main fast
%%
.+  { putchar_unlocked('\'');
      fwrite_unlocked(yytext,yyleng,1,stdout);
      putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }

e sotto stress è 2-3 volte più veloce delle pipeline di pasta, che sono esse stesse almeno 5 volte più veloci di qualsiasi altra cosa.


Linux
  1. Unire 3 righe consecutive con lo scambio?

  2. Come estrarre/modificare le righe in un file di testo i cui dati sono separati in campi?

  3. Usare l'a capo automatico con Mc?

  4. Come elencare i domini con DNSSEC

  5. Provaci:una moderna lista di cose da fare con un timer

Comando Netstat in Linux - 28 comandi con esempi

Creazione di elenchi di parole con Crunch su Kali Linux

Comando SS in Linux con esempi utili

Come elencare i filesystem in Linux con lfs

Trasformare più righe in una riga separata da virgole

Come sottrarre righe (linee) con AWK