更改uniq命令的分隔符

时间:2013-06-10 06:06:31

标签: 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可能会有问题,因为前导空格的数量会根据计数中的小数位数而变化。

5 个答案:

答案 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)

  1. 使用printf的工作原理:

    xargs -L 1 printf '%s,%s\n' < file
    
  2. 使用bash

    printf '%s,%s\n' $(<file)
    
  3. 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