我有一个空格分隔的表(如本例所示):
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
首先,脚本构建两个数组(a
和b
),以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