打印转置行中的第二列

打印转置行中的第二列

我有一个空格分隔的表(如本例所示):

A 101
B 92 102
C 83 93 103
D 74 84 94 104

我想获得这个:

  • 具有关联值的样本 A 和所有第二列(从样本 B 的第一个值开始)在一行中转置
    (换句话说,整个第一行,后面是每个后续行的第二个字段),
  • 具有关联值的样本 B 和所有第二列(从样本 C 的第一个值开始)在一行中转置
    (换句话说,整个第二行,后跟每个后续行的第二个字段),
  • ETC。

这是我输出的前四行的前五列:

A 101 92 83 74 …
B 92 102 83 74 …
C 83 93 103 74 …
D 74 84 94 104 …

答案1

awk '
{
    a[NR]=$0
    b[NR]=$2
}
END{
    for(i=1;i<=NR;i++){
        k=i+1
        printf("%s ",a[i])
        for(j=k;j<=NR;j++)
            printf("%s ",b[j])
        print ""
    }
}' table.file

首先,脚本构建两个数组(ab),以NR(行号)作为索引。而不是将数组的所有元素添加到a数组的每个元素b,但不包括第一个k元素。对于内存限制的情况,可以通过输入文件的两次传递来完成相同的操作:

awk '
NR==FNR{
    b[NR]=$2
    rows=NR
    next
}
{
    printf("%s ",$0)
    for(j=FNR+1;j<=rows;j++)
        printf("%s ",b[j])
    print ""
    }
}' table.file table.file

相关内容