我希望uniq命令的输出以逗号分隔,以代替:
30 hello
31 world
36 hey_there
142 i_am_bigest
我会得到:
30,hello
31,world
36,hey_there
142,i_am_biggest
我的输入没有空格,但只使用sed
或tr
可能会有问题,因为前导空格的数量会根据计数中的小数位数而变化。
答案 0 :(得分:18)
将输出传输到
sed -e 's/^ *//;s/ /,/'
首先删除前导空格(^ *
),然后用逗号替换第一个空格。
答案 1 :(得分:4)
man uniq
(至少在Mac OS X上,又称BSD)没有给出任何方法来处理它。你最好的选择可能是sed
:
... |
uniq -c |
sed 's/^ *\([0-9][0-9]*\) /\1,/'
uniq -c
的输出包含一些空格,数字,空白和输入字符串。
基本思想是sed
脚本查找任意数量的空格,数字和空格,并用数字和逗号替换它。查看uniq
的POSIX规范,输出不应该有前导空格(printf()
格式应该是"%d %s"
),但实际上前导空格是正常的(对于足够小的重复) count;在Mac OS X上,输出printf()
格式实际上是"%5d %s"
)。
答案 2 :(得分:0)
将输出传递给:
perl -lane '{print join ",", @F}'
答案 3 :(得分:0)
使用printf
的工作原理:
xargs -L 1 printf '%s,%s\n' < file
使用bash
:
printf '%s,%s\n' $(<file)
在 POSIX 外壳中,这也将起作用:
printf '%s,%s\n' $( ...various commands... | uniq -c )
答案 4 :(得分:0)
使用@nneonneo 的回答,我编写了这个函数并将其添加到我的 .bashrc 中:
uniqc(){
uniq -c |sed -e 's/^ *//;s/ /,/'
}
用法,而不是 doSomething | uniq -c
,做:
doSomething | uniqc