如何在一个文件内调换多个数据块?每个数据块以行“#description”开始,并以两个空行结束。典型的输入文件如下所示:
# block_01
Temp ST_01 ST_02 ST_03 ST_04
ag7 -0.0295167 0.0553285 0.00883727 0.392553
bc9 -0.0513702 0.0355596 -0.0165404 0.252816
cc9 -0.0303508 -0.00354388 0.0428582 0.0882037
cd3 -0.0239757 -0.0363891 0.0227775 0.270722
# block_02
Temp ST_01 ST_02 ST_03 ST_04
ag7.b -0.00284193 0.0260536 0.163357 -0.17291
bc9.b -0.0212977 0.0191269 0.0330521 -0.17346
cc9.b -0.0138837 -0.0220729 0.0814398 -0.0478094
cd3.f -0.053152 -0.0041982 -0.0948933 -0.020557
# block_03
Temp ST_01 ST_02 ST_03 ST_04
...
转置后所需的输出文件应如下所示:
# block_01
Temp ag7 bc9 cc9 cd3
ST_01 -0.0295167 -0.0513702 -0.0303508 -0.0239757
ST_02 0.0553285 0.0355596 -0.00354388 -0.0363891
ST_03 0.00883727 -0.0165404 0.0428582 0.0227775
ST_04 0.392553 0.252816 0.0882037 0.270722
# block_02
Temp ag7.b bc9.b cc9.b cd3.f
ST_01 -0.00284193 -0.0212977 -0.0138837 -0.053152
ST_02 0.0260536 0.0191269 -0.0220729 -0.0041982
ST_03 0.163357 0.0330521 0.0814398 -0.0948933
ST_04 -0.17291 -0.17346 -0.0478094 -0.020557
# block_03
Temp ag7.b bc9.b cc9.b cd3.f
...
不一定只能在 gnuplot 中完成。也欢迎使用 bash 或 awk 脚本。
cat $1 | conv -U | gawk 'BEGIN {
i = 1
FS = "\t"
}
{ # save data in array
for (j = 1; j <= NF; j++) {
list[i, j] = $j
}
if (j > jmax) {
jmax = j
}
i++
}
END { # print data transposed
jend = jmax - 1
iend = i - 1
for (j = 1; j <= jend; j++) {
printf "%s", list[1, j]
for (i = 2; i <= iend; i++) {
printf "\t%s", list[i, j]
}
if(j<jend) printf ("\n") # linefeed after each row (except the last row)
}
}
'
我意识到我用了坏猫的东西......
conv -U 在 UNIX 的 cygwin 中将 crlf 转换为 lf,如果不需要,可以删除。