2017-10-09 110 views
2

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

例如

輸入

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 

謝謝!

+0

歡迎來到堆棧溢出,所以你想要最後一列打印998次或乘以998次?截至目前,我的答案僅僅是打印最後一欄998次。 – RavinderSingh13

回答

1

用簡單的for循環和打印線,你想多少次:

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

使用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 
1

awk中溶液(單print動作):

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

只是好奇 - 爲什麼寫'n = 998;而( - n)foo'而不是'for(n = 1; n <= 998; n ++)foo'? –

1

它變得非常容易在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以獲得您所需的輸出。

+0

@AkshayHegde:謝謝。爲了糾正你,我們不需要'gsub(/./,「」$ NF,s)',因爲它會替換我們不想要的每個字符。我們只想替換'格式說明符'。爲了驗證它,你可以附加一個字符串格式化字符串say's = s「hello」'現在'gsub(/./,「」$ NF,s)'這會替換每個字符包括'h''''如果你使用'gsub(/ /,「」$ NF,s)',它只會在'hello'之前替換你的指定符。可能這會在這個例子中起作用,因爲字符串中只有說明符,但這不是我想要的。 – batMan