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
关键字后面的 #
不是必需的,但如果不是太困难则需要。
尝试过的解决方案
我已尝试通过管道传输到 column
和 awk
,但未能产生所需的结果。
编辑
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
问题
我正在编写一个 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
关键字后面的 #
不是必需的,但如果不是太困难则需要。
尝试过的解决方案
我已尝试通过管道传输到 column
和 awk
,但未能产生所需的结果。
编辑
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