Bash: 由两列组成的数组的输出列

Bash: Output columns from array consisting of two columns

问题

我正在编写一个 bash 脚本并且我有一个数组,其中每个值由两列组成。它看起来像这样:

for i in "${res[@]}"; do
  echo "$i"
done

#Stream1
0 a1
1 b1
2 c1
4 d1
6 e1
#Stream2
0 a2
1 b2
3 c2
4 d2
9 f2
...

我想将这个数组的输出组合成一个更大的 table,并多路复用索引。此外,我想通过插入注释 #Sec 来格式化第一行。 我希望结果是这样的:

#Sec  Stream1 Stream2
0     a1      a2
1     b1      b2
2     c1
3             c2
4     d1      d2
6     e1
9             f2

插入 #Sec 并删除 Stream 关键字后面的 # 不是必需的,但如果不是太困难则需要。

尝试过的解决方案

我已尝试通过管道传输到 columnawk,但未能产生所需的结果。


编辑

res是bash脚本中的数组。它很大,所以我只会提供一个简短的选择。 运行 echo "$( typeset -p res)" 产生以下输出:

declare -a res='([1]="#Stream1
0 3072
1 6144
2 5120
3 1024
5 6144
..." [2]="#Stream2
0 3072
1 5120
2 4096
3 3072
53 3072
55 1024
57 2048")'

至于'result',我的初衷是将结果table分配给一个变量,并在另一个awk脚本中使用它来计算指定指数的移动平均线,并绘制结果。这将针对约 20 个不同的文件完成。但是我对其他解决方案持开放态度。

流的数量可能从 10 到 50 不等。每个流有 100 到 300 行。

您可以使用这个 awk 解决方案:

cat tabulate.awk

NF == 1 {
   h = h OFS substr(, 2)
   ++numSec
   next
}
{
   keys[]
   map[,numSec] = 
}
END {
   print h
   for (k in keys) {
      printf "%s", k
      for (i=1; i<=numSec; ++i)
         printf "\t%s", map[k,i]
      print ""
   }
}

然后将其用作:

awk -v OFS='\t' -v h='#Sec' -f tabulate.awk file

#Sec  Stream1  Stream2
0     a1       a2
1     b1       b2
2     c1
3              c2
4     d1       d2
6     e1
9              f2