【问题标题】:Create a new column each for loop tour为循环游览创建一个新列
【发布时间】:2021-08-25 12:12:35
【问题描述】:

我有一个 for 循环,它给了我那种标准输出:

5 4473
4 4394
3 4386
2 4750
1 5963
6 4605
5 4270
4 4053
3 3909
2 4267
1 5362
3 3150
2 3457
1 4795

这里有 3 个循环游览。我想为每个游览创建一个新列,而不是逐行添加。我的意思是,我的第一次循环之旅给了我:

5 4473
4 4394
3 4386
2 4750
1 5963

第二个给出:

6 4605
5 4270
4 4053
3 3909
2 4267
1 5362

等等..

我想得到这样的输出:

6 0  6 4605 6 0    
5 4473 5 4270 5 0 
4 4394 4 4053 4 0 
3 4386 3 3909 3 3150
2 4750 2 4267 2 3457
1 5963 1 5362 1 4795

我简要地向你展示我的命令:

for i in out_aligned.bc100*gff; do awk 'NR>3' ${i} | 
awk '$3=="exon"' | 
awk '{print $12}' | 
uniq -c | 
awk '{print $1}' |  
sort -k1rn | uniq -c | 
awk '{t=$1; $1=$2; $2=t; print}'; 
done

我尝试使用 prjoinpaste 但不可能得到那个。

通过仅获取行索引(例如,上面的行索引为 6 但它可能更高)来创建这种数组可能会非常好:

6 0 4605 0
5 4473 4270 0 
4 4394 4053 0
3 4386 3909 3150 
2 4750 4267 3457 
1 5963 5362 4795 

最好的

【问题讨论】:

  • 如果您发布一个关于显示几个 *gff 文件作为示例输入的新问题,我们可以帮助您获得所需的最终输出,而无需中间 shell 循环和调用所有这些命令。

标签: bash for-loop awk


【解决方案1】:
$ cat tst.awk
{
    key = $1
    val = $2

    if ( NR==1 ) {
        minKey = maxKey = key
    }
    else {
        maxKey = ( key >= maxKey ? key : maxKey )
        minKey = ( key <= minKey ? key : minKey )
    }

    if ( key >= prev ) {
        numCols++
    }

    vals[key,numCols] = val
    prev = key
}

END {
    for ( key=maxKey; key>=minKey; key-- ) {
        for ( colNr=1; colNr<=numCols; colNr++ ) {
            val = vals[key,colNr]
            printf "%d%s%d%s", key, OFS, val, (colNr<numCols ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file
6 0 6 4605 6 0
5 4473 5 4270 5 0
4 4394 4 4053 4 0
3 4386 3 3909 3 3150
2 4750 2 4267 2 3457
1 5963 1 5362 1 4795

【讨论】:

    【解决方案2】:

    awk 来救援!

    $ awk       '{c+=p<$1; a[$1,c]=$2; p=$1} 
          $1>max {max=$1} 
          END    {for(i=max;i;i--) 
                    for(j=1;j<=c;j++) 
                      printf "%d %d%s",i,a[i,j]+0,(j==c?ORS:OFS)}' file 
      | column -t
    
    6  0     6  4605  6  0
    5  4473  5  4270  5  0
    4  4394  4  4053  4  0
    3  4386  3  3909  3  3150
    2  4750  2  4267  2  3457
    1  5963  1  5362  1  4795
    

    行索引只使用一次

    $ awk       '{c+=p<$1; a[$1,c]=$2; p=$1} 
          $1>max {max=$1} 
          END    {for(i=max;i;i--) 
                    {printf "%d",i; 
                     for(j=1;j<=c;j++) 
                       printf " %d%s",a[i,j]+0,(j==c?ORS:OFS)}}' file 
     | column -t
    
    6  0     4605  0
    5  4473  4270  0
    4  4394  4053  0
    3  4386  3909  3150
    2  4750  4267  3457
    1  5963  5362  4795
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多