【问题标题】:Unix cut/ awk: Print same column multiple times (e.g. 1000 times)Unix cut/awk:多次打印同一列(例如 1000 次)
【发布时间】:2017-10-09 10:36:58
【问题描述】:

如何多次复制一列?

例如

输入

1   4771131 4772199 ENSMUSG00000103922  0   +   0.670011
1   4773206 4785739 ENSMUSG00000033845  0   -   95.0352
1   4778063 4779212 ENSMUSG00000102275  0   -   0.1806
1   4807788 4848410 ENSMUSG00000025903  0   +   110.078

输出

1   4771131 4772199 ENSMUSG00000103922  0   +   0.670011    0.670011 x 998 times
1   4773206 4785739 ENSMUSG00000033845  0   -   95.0352 95.0352 x 998 times
1   4778063 4779212 ENSMUSG00000102275  0   -   0.1806  0.1806 x 998 times
1   4807788 4848410 ENSMUSG00000025903  0   +   110.078 110.078 x 998 times

谢谢!

【问题讨论】:

  • 欢迎堆栈溢出,所以你想打印最后一列998次还是乘以998次?到目前为止,我的答案只是打印最后一列 998 次。

标签: linux unix awk cut


【解决方案1】:

使用简单的 for 循环并打印您想要多少次的行:

awk '{printf $0;for(i=1;i<=998;i++){printf("%s%s",$NF,i==998?"":" ")};print ""}' Input_file

【讨论】:

    【解决方案2】:

    使用awk,根据需要更改变量n=&lt;your_interest&gt;的值。

    单线:

     awk -v col=1 -v n=2 'function repeat(v, n,i){for(i=1; i<=n; i++)printf("%s%s",(i==1?"":OFS),v)}{for(i=1; i<=NF; i++)printf("%s%s",(i==col?repeat($i,n):$i),i==NF?RS:OFS)}' infile
    

    输入:

    $ cat infile
    1   4771131 4772199 ENSMUSG00000103922  0   +   0.670011
    1   4773206 4785739 ENSMUSG00000033845  0   -   95.0352
    1   4778063 4779212 ENSMUSG00000102275  0   -   0.1806
    1   4807788 4848410 ENSMUSG00000025903  0   +   110.078
    

    col=7 and v=5

    $ awk -v col=7 -v n=5 'function repeat(v, n,i){for(i=1; i<=n; i++)printf("%s%s",(i==1?"":OFS),v)}{for(i=1; i<=NF; i++)printf("%s%s",(i==col?repeat($i,n):$i),i==NF?RS:OFS)}' infile
    1 4771131 4772199 ENSMUSG00000103922 0 + 0.670011 0.670011 0.670011 0.670011 0.670011
    1 4773206 4785739 ENSMUSG00000033845 0 - 95.0352 95.0352 95.0352 95.0352 95.0352
    1 4778063 4779212 ENSMUSG00000102275 0 - 0.1806 0.1806 0.1806 0.1806 0.1806
    1 4807788 4848410 ENSMUSG00000025903 0 + 110.078 110.078 110.078 110.078 110.078
    

    假设如果你设置第一列是col=1,那么

    $ awk -v col=1 -v n=5 'function repeat(v, n,i){for(i=1; i<=n; i++)printf("%s%s",(i==1?"":OFS),v)}{for(i=1; i<=NF; i++)printf("%s%s",(i==col?repeat($i,n):$i),i==NF?RS:OFS)}' infile
    1 1 1 1 1 4771131 4772199 ENSMUSG00000103922 0 + 0.670011
    1 1 1 1 1 4773206 4785739 ENSMUSG00000033845 0 - 95.0352
    1 1 1 1 1 4778063 4779212 ENSMUSG00000102275 0 - 0.1806
    1 1 1 1 1 4807788 4848410 ENSMUSG00000025903 0 + 110.078
    

    更好的可读性:

    awk -v col=7 -v n=5 '
                         function repeat(v, n,i)
                         {
                           for(i=1; i<=n; i++)
                                printf("%s%s",(i==1?"":OFS),v)
                         }
                         {
                           for(i=1; i<=NF; i++)
                             printf("%s%s",(i==col?repeat($i,n):$i),i==NF?RS:OFS)
                         }
                       ' infile
    

    【讨论】:

      【解决方案3】:

      Awk 解决方案(使用单个 print 操作):

      awk '{ n=998;r=$NF; while(--n) r=r FS $NF; print $0,r}' OFS='\t' file
      

      【讨论】:

      • 只是好奇——为什么写n=998; while(--n) foo而不是for (n=1;n&lt;=998;n++) foo
      【解决方案4】:

      借助格式化字符串的强大功能,在 awk 中变得非常简单。

      例如

      $ awk -v count=3 '{s=sprintf("%0*s",count,""); gsub(/ /," "$NF,s); printf $0 s "\n"}' file
      1   4771131 4772199 ENSMUSG00000103922  0   +   0.670011 0.670011 0.670011 0.670011
      1   4773206 4785739 ENSMUSG00000033845  0   -   95.0352 95.0352 95.0352 95.0352
      1   4778063 4779212 ENSMUSG00000102275  0   -   0.1806 0.1806 0.1806 0.1806
      1   4807788 4848410 ENSMUSG00000025903  0   +   110.078 110.078 110.078 110.078
      

      您可以将其修改为 count=999 以获得所需的输出。

      【讨论】:

      • @AkshayHegde:谢谢。为了纠正您,我们不需要gsub(/./," "$NF,s),因为它将替换我们不想要的每个字符。我们只想替换format specifiers。要验证它,您可以将字符串附加到格式化字符串,例如 s=s"hello" 和现在 gsub(/./," "$NF,s) 这将替换每个字符,包括 h e l l o 但如果您使用 gsub(/ /," "$NF,s) 它会仅在 hello 之前替换您的说明符。可能这在这个例子中会起作用,因为字符串中只有说明符,但这不是我想要的。
      猜你喜欢
      • 2012-09-06
      • 2011-04-26
      • 2018-07-02
      • 2014-04-09
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多