如何在 gnuplot 可读文件中转置数据块(表)?

问题描述 投票:0回答:1

如何在一个文件内调换多个数据块?每个数据块以行“#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 脚本。

gnuplot
1个回答
0
投票
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,如果不需要,可以删除。

© www.soinside.com 2019 - 2024. All rights reserved.