2014-07-22 19 views
5

Ho un problema che non riesco a risolvere da solo, né effettuando ricerche all'interno degli indirizzi.Conversione di un elenco in stringhe separate da virgole separate da virgole

Ho un elenco, memorizzato in un file, in questo modo:

apple 
banana 
pineapple 

E vorrei ogni stringa di essere in doppio apice, e separati da virgole, in questo modo:

"apple","banana","pineapple" 

Idealmente, l'ultima parola della lista non dovrebbe avere una virgola dopo di essa, ma questo non è obbligatorio.

L'idea alla base di questo è di essere in grado di creare un documento formattato JSON popolato da un elenco di elementi memorizzati in un file di testo normale.

Grazie mille in anticipo.

risposta

5
awk -v RS='' -v OFS='","' 'NF { $1 = $1; print "\"" $0 "\"" }' file 

uscita:

"apple","banana","pineapple" 
+0

Grandi grazie mille! Ho provato qualcosa di simile da un altro thread qui, ma non ho potuto farlo funzionare. La tua soluzione funziona perfettamente. – Nesousx

+0

@Nesousx Ho aggiunto un piccolo aggiustamento solo per assicurarsi che ci siano effettivamente campi intorno. Prego :) – konsolebox

+1

Cosa fa '$ 1 = $ 1'? –

0

Un'altra awk

awk '{printf "\"%s\"",$1}' file | awk '{gsub(/""/,"\",\"")}1' 
"apple","banana","pineapple" 

o

awk '{printf "\"%s\"",$1}' file | sed 's/""/","/g' 
2

Credo che Perl merita una menzione:

perl -lne 'push @a, qq("$_") }{ print join(",", @a)' file 

Crea un array @a contenente il valore su ogni riga, racchiuso tra virgolette. Quindi, una volta elaborato il file, stampa un elenco separato da virgole di tutti gli elementi in @a.

Il cosiddetto eskimo greeting }{ è un'abbreviazione utilizzato per creare un blocco END, grazie al modo in cui le -n e -p interruttori sono implementati.

uscita:

"apple","banana","pineapple" 

Se si tratta di JSON che stai cercando, è possibile utilizzare encode_json:

perl -MJSON -lne 'push @a, $_ }{ print encode_json(\@a)' file 

Questo trasforma l'array in una vera e propria lista di JSON-encoded:

["apple","banana","pineapple"] 
+0

'} {' è un trucco divertente, ma dovrebbe essere chiarito a beneficio dei lettori principianti che è solo un effetto collaterale di '-p' che avvolge l'espressione in' {} ', non una sorta di parola chiave in e di per sé –

+1

@Josip Ho modificato per aggiungere un po 'di quello. –

0

No awk di fantasia:

awk 'x{x=x","}{x=x"\""$1"\""}END{print x}' file 

Explained versione:

awk ' 
    out { out = out "," }   # if there is already something in the output string, append a comma to it 
     { out = out "\"" $1 "\"" } # always append the quoted first column of input to the output string 
    END { print out }    # finally, print the output string 
' file 

La particolare ordinamento delle materie prime due righe - impedisce la virgola finale di aggiungersi.

1

È inoltre possibile utilizzare questo metodo:

sed -r ':loop ; N ; s/\n/,/g ; $s/[^,]+/"&"/g ; t loop' filename 
0

sed e paste soluzione:

sed -e 's/^\|$/"/g' file | paste -s -d, - 
Problemi correlati