更改uniq命令的分隔符



我希望uniq命令的输出以逗号分隔,这样就不会出现:

     30 hello
     31 world
     36 hey_there
    142 i_am_bigest

我会:

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

我的输入没有空格,但是仅仅使用sedtr可能会出现问题,因为前导空格的数量根据计数中的十进制位数而变化

输出到

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

首先删除前导空格(^ *),然后用逗号替换第一个空格。

man uniq(至少在Mac OS X上,又名BSD)没有给出任何方法来处理。你最好的选择可能是sed:

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

uniq -c的输出由一些空格、一个数字、一个空白和输入字符串组成。

基本思想是sed脚本查找任意数量的空白,一个数字和一个空白,并用数字和逗号替换它。看看uniq的POSIX规范,输出不应该有前导空白(printf()格式应该是"%d %s"),但在实践中,前导空白是正常的(对于足够小的重复计数;在Mac OS X上,输出的printf()格式实际上是"%5d %s")。

输出到:

perl -lane '{print join ",", @F}'
  1. 使用printf works:

    xargs -L 1 printf '%s,%sn' < file
    
  2. Using bash:

    printf '%s,%sn' $(<file)
    
  3. POSIX shell中这也可以工作:

    printf '%s,%sn' $( ...various commands... | uniq -c )
    

使用@nneonneo的答案,我编写了这个函数并将其添加到我的。bashrc:

uniqc(){
    uniq -c |sed -e 's/^ *//;s/ /,/' 
}

用法,代替doSomething | uniq -c,做:

doSomething | uniqc

最新更新