2013-06-10 13 views
6

mi piacerebbe l'output del comando uniq da separati da virgole, in modo che invece di:Modifica delimitatore del comando uniq

 30 hello 
    31 world 
    36 hey_there 
    142 i_am_bigest 

vado a prendere:

30,hello 
31,world 
36,hey_there 
142,i_am_biggest 

mio ingresso non ha spazi, ma l'uso di sed o tr può essere un problema poiché il numero di spazi iniziali varia in base al numero di cifre decimali nel conteggio.

risposta

13

tubo dell'uscita di

sed -e 's/^ *//;s/ /,/' 

Questo primo rimuove gli spazi iniziali (^ *) quindi sostituisce il primo spazio con una virgola.

4

man uniq (almeno su Mac OS X, alias BSD) non fornisce alcun modo per gestirlo. La cosa migliore è probabilmente sed:

... | 
uniq -c | 
sed 's/^ *\([0-9][0-9]*\) /\1,/' 

L'uscita dal uniq -c si compone di alcuni spazi vuoti, un numero, un vuoto, e la stringa di input.

L'idea di base è che lo script sed cerca un numero arbitrario di spazi, un numero e uno spazio vuoto e lo sostituisce con il numero e una virgola. Guardando le specifiche POSIX per uniq, l'output non dovrebbe avere spazi vuoti iniziali (il formato printf() deve essere "%d %s"), ma in pratica gli spazi vuoti sono normali (per conteggi di ripetizioni abbastanza piccoli, in Mac OS X il formato di output è printf() efficacemente "%5d %s").

0

inviare l'output:

perl -lane '{print join ",", @F}' 
+0

Come con la soluzione 'awk' basata, questo non funziona bene quando le linee di ingresso hanno molteplici campi secondo Perl. Ad esempio, con input ordinato composto da 4 righe contenenti 'aaa aaa aaa' e 5 righe contenenti' aba aba aba aba', l'output dal tuo script (dopo 'sort' e' uniq -c') è di due righe: ' 4, aaa, aaa, aaa, aaa' e '5, aba, aba, aba, aba'; nota le virgole extra (e indesiderate). –

Problemi correlati