11

我希望 uniq 命令的输出用逗号分隔,而不是:

     30 hello
     31 world
     36 hey_there
    142 i_am_bigest

我去拿:

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

我的输入没有空格,但仅使用sedortr可能是一个问题,因为前导空格的数量根据计数中的小数位数而变化。

4

5 回答 5

20

管道输出到

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

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

于 2013-06-10T06:13:56.260 回答
4

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

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

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

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

于 2013-06-10T06:14:06.870 回答
1

管道输出到:

perl -lane '{print join ",", @F}'
于 2013-06-10T06:23:35.857 回答
1
  1. 使用printf作品:

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

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

    printf '%s,%s\n' $( ...various commands... | uniq -c )
    
于 2019-01-16T19:41:46.747 回答
0

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

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

使用,而不是doSomething | uniq -c,做:

doSomething | uniqc
于 2021-04-10T15:51:56.667 回答