2014-07-22 13 views
5

Mam problem, którego nie mogę naprawić samodzielnie ani w Internecie.Konwertowanie listy na podwójnie cudzysłowy oddzielone ciągi znaków

Mam listę, przechowywane w pliku, na przykład:

apple 
banana 
pineapple 

I chciałbym każdy łańcuch zostanie w cudzysłów, a oddzielone przecinkami, na przykład:

"apple","banana","pineapple" 

Najlepiej byłoby, gdyby ostatnie słowo na liście nie zawierało przecinka, ale nie jest to obowiązkowe.

Ideą jest stworzenie sformatowanego dokumentu JSON zapełnionego listą pozycji przechowywanych w pliku tekstowym.

Dziękuję bardzo z góry.

Odpowiedz

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

wyjściowa:

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

Wielkie dzięki! Próbowałem już czegoś podobnego z innego wątku, ale nie mogłem go uruchomić. Twoje rozwiązanie działa idealnie. – Nesousx

+0

@Nesousx Dodałem drobne poprawki, aby upewnić się, że rzeczywiście są tam pola. Nie ma za co :) – konsolebox

+1

Co robi '$ 1 = 1 $'? –

0

Innym awk

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

lub

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

myślę, że Perl również zasługuje na wzmiankę:

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

Tworzy tablicę @a zawierającą wartość w każdym wierszu, zawijaną w cudzysłowy. Następnie, po przetworzeniu pliku, zostanie wydrukowana lista oddzielonych przecinkami wszystkich elementów w @a.

Tzw eskimo greeting }{ jest skróconym wykorzystane do utworzenia bloku END, ze względu na sposób, że -n i -p przełączniki są wdrażane.

wyjściowa:

"apple","banana","pineapple" 

Jeśli to JSON, którego szukasz, można użyć encode_json:

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

Włącza tablicę w prawdziwe JSON zakodowanej listy:

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

'} {' to zabawna sztuczka, ale powinno to być wyjaśnione dla korzyści czytelników nowicjuszy, że to tylko efekt uboczny '-p' zawijania wyrażenia w' {} ', a nie jakiegoś słowa kluczowego wi samego siebie –

+1

@Josip Edytowałem, aby dodać trochę o tym. –

0

Bez wymyślnych rzeczy awk:

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

Poradnik wersję:

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 

Szczególny uporządkowanie spraw Pierwsze dwie linie - zapobiega końcowy przecinek przed dołączane.

1

Można również użyć tej metody:

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

sed i paste rozwiązanie:

sed -e 's/^\|$/"/g' file | paste -s -d, - 
Powiązane problemy