Pipe the output to
sed -e 's/^ *//;s/ /,/'
This first removes the leading spaces (^ *
) then replaces the first space with a comma.
سؤال
I'd like the output of the uniq command to be comma separated, so that instead of:
30 hello
31 world
36 hey_there
142 i_am_bigest
I'll get:
30,hello
31,world
36,hey_there
142,i_am_biggest
My input has no spaces, but just using sed
or tr
can be a problem since the number of leading spaces varies according to the number of decimal digits in the count.
المحلول
Pipe the output to
sed -e 's/^ *//;s/ /,/'
This first removes the leading spaces (^ *
) then replaces the first space with a comma.
نصائح أخرى
man uniq
(at least on Mac OS X, aka BSD) does not give any way to handle that. Your best bet is probably sed
:
... |
uniq -c |
sed 's/^ *\([0-9][0-9]*\) /\1,/'
The output from uniq -c
consists of some blanks, a number, a blank, and the input string.
The basic idea is that the sed
script looks for an arbitrary number of blanks, a number and a blank, and replace it by the number and a comma. Looking at the POSIX specification for uniq
, the output is not supposed to have leading blanks (the printf()
format should be "%d %s"
), but leading blanks are normal in practice (for small enough repeat counts; on Mac OS X, the output printf()
format is effectively "%5d %s"
).
pipe the output to :
perl -lane '{print join ",", @F}'
Using printf
works:
xargs -L 1 printf '%s,%s\n' < file
Using bash
:
printf '%s,%s\n' $(<file)
In a POSIX shell this would also work:
printf '%s,%s\n' $( ...various commands... | uniq -c )
Using @nneonneo's answer, I wrote this function and added it to my .bashrc:
uniqc(){
uniq -c |sed -e 's/^ *//;s/ /,/'
}
Usage, instead of doSomething | uniq -c
, do:
doSomething | uniqc