2013-06-10 13 views
6

ich die Ausgabe des Befehls uniq möchte Komma getrennt werden, so dass statt:Ändern Begrenzer des Befehls uniq

 30 hello 
    31 world 
    36 hey_there 
    142 i_am_bigest 

ich bekommen werde:

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

Mein Eingang hat keine Leerzeichen, aber nur mit sed oder tr kann ein Problem sein, da die Anzahl der führenden Leerzeichen variiert je nach Anzahl der Dezimalstellen in der Zählung.

Antwort

13

Rohr der Ausgang

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

Dieses ersten entfernt die führenden Leerzeichen (^ *) dann mit einem Komma den ersten Raum ersetzt.

4

man uniq (zumindest auf Mac OS X, alias BSD) gibt keine Möglichkeit, damit umzugehen. Ihre beste Wette ist wahrscheinlich sed:

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

Die Ausgabe von uniq -c besteht aus einigen Blanks, eine Zahl, ein leeren, und die Eingabezeichenfolge.

Die Grundidee ist, dass das Skript sed nach einer beliebigen Anzahl von Leerzeichen, einer Zahl und einem Leerzeichen sucht und es durch die Zahl und ein Komma ersetzt. Betrachtet man die POSIX-Spezifikation für uniq, soll die Ausgabe keine führenden Leerzeichen haben (das printf()-Format sollte "%d %s" sein), aber führende Leerzeichen sind in der Praxis normal (für kleine genug Wiederholungen; unter Mac OS X ist das Ausgabeformat printf()) effektiv "%5d %s").

0

Rohr der Ausgang auf:

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

Wie bei der 'awk'-basierte Lösung, bedeutet dies nicht gut funktionieren, wenn die Eingangsleitungen gemäß Perl mehrere Felder aufweisen. Bei einer sortierten Eingabe bestehend aus 4 Zeilen mit 'aaa aaa aaa aaa' und 5 Zeilen mit 'aba aba aba aba' besteht die Ausgabe aus Ihrem Skript (nach' sort' und 'uniq -c') aus zwei Zeilen:' 4, aaa, aaa, aaa, aaa' und '5, aba, aba, aba, aba'; Notieren Sie die zusätzlichen (und unerwünschten) Kommas. –