繁体   English   中英

Unix cut / awk:多次打印同一列(例如1000次)

[英]Unix cut/ awk: Print same column multiple times (e.g. 1000 times)

如何多次复制列?

例如

输入

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

谢谢!

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

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

使用awk ,根据需要更改变量n=<your_interest>值。

一内胆:

 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

AWK解决方案(单次print操作):

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

利用格式化字符串的强大功能, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM