【问题标题】:Changing delimiter of the uniq command更改 uniq 命令的分隔符
【发布时间】:2023-04-02 00:40:01
【问题描述】:

我希望 uniq 命令的输出用逗号分隔,这样就可以代替:

     30 hello
     31 world
     36 hey_there
    142 i_am_bigest

我会得到:

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

我的输入没有空格,但仅使用 sedtr 可能会出现问题,因为前导空格的数量会根据计数中的小数位数而有所不同。

【问题讨论】:

  • 这个问题看起来特别像改变... | sort -rn | uniq -c的输出。

标签: uniq


【解决方案1】:

管道输出到

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

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

【讨论】:

    【解决方案2】:

    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")。

    【讨论】:

      【解决方案3】:

      通过管道输出到:

      perl -lane '{print join ",", @F}'
      

      【讨论】:

      • 与基于awk 的解决方案一样,根据 Perl,当输入行具有多个字段时,这将无法正常工作。例如,排序后的输入由包含aaa aaa aaa aaa 的4 行和包含aba aba aba aba 的5 行组成,脚本的输出(在sortuniq -c 之后)是两行:4,aaa,aaa,aaa,aaa5,aba,aba,aba,aba;注意多余的(和不需要的)逗号。
      【解决方案4】:
      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 )
        

      【讨论】:

        【解决方案5】:

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

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

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

        doSomething | uniqc
        

        【讨论】:

          猜你喜欢
          • 2012-02-29
          • 2022-07-13
          • 1970-01-01
          • 1970-01-01
          • 2013-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多