【问题标题】:how to write repeat patterns如何编写重复模式
【发布时间】:2014-03-26 19:24:27
【问题描述】:

文件具有由制表符分隔的唯一“标签”和“值”列表。我想根据给定的值重复标签。输入文件示例:

标记值

AAAAA   2
BBBBB   1
CCCCC   3
DDDDD   5

预期的输出文件

AAAAA 
AAAAA 
BBBBB 
CCCCC 
CCCCC 
CCCCC 
DDDDD 
DDDDD 
DDDDD
DDDDD
DDDDD

能否请您告诉我 awk/sed 命令。非常感谢。

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    GNU awk 的替代版本:

    awk '{while($2--) print $1}'
    

    这不是一个用 sed 解决的好问题。您需要将数字 n 替换为 n 1(例如 3 与 111),并在使用这些 1 时打印单词。

    【讨论】:

      【解决方案2】:

      这个awk 应该这样做:

      awk '{for (i=1;i<=$2;i++) print $1}' file
      AAAAA
      AAAAA
      BBBBB
      CCCCC
      CCCCC
      CCCCC
      DDDDD
      DDDDD
      DDDDD
      DDDDD
      DDDDD
      

      它循环在列#2中找到的次数,然后打印列#1中的单词

      【讨论】:

        【解决方案3】:

        这是perl 备用:

        $ perl -ane 'print "$F[0]\n"x$F[1]' file
        AAAAA
        AAAAA
        BBBBB
        CCCCC
        CCCCC
        CCCCC
        DDDDD
        DDDDD
        DDDDD
        DDDDD
        DDDDD
        

        【讨论】:

          【解决方案4】:

          这可能对你有用(GNU sed):

          sed -r 's/(\S+)\s+(\S+)/seq \2 | sed c\1/e' file
          

          将该行拆分为seqsed 命令的参数并进行评估。

          【讨论】:

            【解决方案5】:

            sed 中做算术很痛苦,所以我会避免这种情况。 awkperl是不错的选择,你也可以直接用bash做:

            while read tag value; do
              while ((value--)); do 
                printf "%s\n" "$tag"
              done
            done < infile
            

            或者作为单行:

            while read tag value; do while ((value--)); do printf "%s\n" "$tag"; done; done < infile
            

            输出:

            AAAAA
            AAAAA
            BBBBB
            CCCCC
            CCCCC
            CCCCC
            DDDDD
            DDDDD
            DDDDD
            DDDDD
            DDDDD
            

            【讨论】:

              猜你喜欢
              • 2018-09-08
              • 1970-01-01
              • 2021-11-29
              • 1970-01-01
              • 1970-01-01
              • 2021-05-05
              • 1970-01-01
              • 2012-06-11
              • 2012-10-27
              相关资源
              最近更新 更多