Linux Unix cut/awk:多次打印同一列(例如1000次)
如何将一列复制多次 e、 g 输入 输出Linux Unix cut/awk:多次打印同一列(例如1000次),linux,unix,awk,cut,Linux,Unix,Awk,Cut,如何将一列复制多次 e、 g 输入 输出 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 tim
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'{printf$0;对于(i=1;i使用awk
,根据需要更改变量n=
值
一行:
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
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
当col=7和v=5时
可读性更好:
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
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-v col=7-v n=5'
功能重复(v,n,i)
{
对于(i=1;iAwk解决方案(使用单个打印
操作):
在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
,以获得所需的输出。欢迎使用堆栈溢出,所以您希望将最后一列打印998次或将其相乘998次?到目前为止,我的答案是只打印最后一列998次。只是好奇-为什么要编写n=998;而(--n)foo
而不是(n=1;n@AkshayHegde:谢谢。为了纠正您的错误,我们不需要gsub(/./,“$NF,s)
,因为它将替换我们不需要的每个字符。我们只想替换格式说明符
。要验证它,您可以在格式化字符串中附加一个字符串,比如s=s“hello”
现在gsub(/./,“$NF,s)
这将替换每个字符,包括h
e
l
l
o
,但是如果使用gsub(/,“$NF,s)
它将只替换hello
之前的说明符。在本例中,这可能会起作用,因为字符串中只有说明符,但这不是我想要的。
$ 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