2013-06-10 16 views
6

Chciałbym wyjście polecenia uniq być oddzielone przecinkami, tak że zamiast:Zmiana separatora polecenia uniq

 30 hello 
    31 world 
    36 hey_there 
    142 i_am_bigest 

Wezmę:

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

mój wkład nie ma spacji, ale używanie tylko sed lub tr może być problemem, ponieważ liczba początkowych spacji zmienia się w zależności od liczby cyfr dziesiętnych w liczniku.

Odpowiedz

13

Rura wyjściowa

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

to najpierw usuwa spacje (^ *), a następnie zastępuje się pierwszą przestrzeń przecinkami.

4

man uniq (przynajmniej na Mac OS X, znany również jako BSD) nie daje żadnego sposobu, aby sobie z tym poradzić. Najprościej jest prawdopodobnie sed:

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

Wyjście z uniq -c składa się z kilku wykrojów, liczba, puste i ciągu wejściowego.

Podstawową ideą jest to, że skrypt sed szuka dowolnej liczby spacji, liczby i spacji i zastępuje ją numerem i przecinkiem. Patrząc na specyfikację POSIX dla uniq, dane wyjściowe nie powinny mieć wiodących spacji (format printf() powinien być "%d %s"), ale początkowe spacje są w praktyce normalne (na tyle mało powtórzeń, w Mac OS X format wyjściowy printf() jest skutecznie "%5d %s").

0

rura wyjście do:

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

Jak z 'roztworze awk' opartej na to nie działa dobrze, gdy linie wejściowe posiadają wiele pól zgodnie z Perl. Na przykład, z posortowanym wejściem składającym się z 4 linii zawierających 'aaa aaa aaa aaa' i 5 linii zawierających' aba aba aba aba', ouptut z twojego skryptu (po 'sort' i' uniq -c') jest dwoma liniami: ' 4, aaa, aaa, aaa, aaa' i "5, aba, aba, aba, aba"; zanotuj dodatkowe (i niechciane) przecinki. –

Powiązane problemy