将数字块排序为

时间:2017-07-05 07:28:13

标签: bash sorting

我有一个文件,其中包含大量数据:

  0.00000000E+00
  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00
  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00
  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  
  0.93071889E-02
  0.14952319E-13  0.55746201E-11  0.89816722E-11  0.46833532E-11  0.14964636E-13
 -0.92995325E-47  0.79969902E-46  0.00000000E+00 -0.21442451-105 -0.86924526E-93
  0.00000000E+00 -0.85777333E-93  0.48179949-102  0.00000000E+00  
  0.18614378E-01
  0.12050471E-12  0.44928328E-10  0.72404536E-10  0.37744496E-10  0.12066634E-12
  0.25848493E-36 -0.13804858E-35  0.56376226E-83  0.20648121E-74 -0.89608567E-66
 -0.20861629E-76 -0.87854256E-66 -0.23574755E-73 -0.73275846E-82  

所需输出是:每个数据块写在自己的列中,列以每个块的“标题”开头,这是第一个数字。例如,最后一个块应如下所示:

0.18614378E-01 0.12050471E-12  0.44928328E-10  0.72404536E-10 0.37744496E-10  0.12066634E-12 0.25848493E-36 -0.13804858E-35  0.56376226E-83 0.20648121E-74 -0.89608567E-66 -0.20861629E-76 -0.87854256E-66 -0.23574755E-73 -0.73275846E-82

我考虑过使用带有FS =''的AWK,但我不知道如何告诉我的bash脚本在读完15个数字后停止并如何保存这15个数字并将它们输出到一个单独的文件中(使用printf可能?)

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您的数据彼此之间没有两行包含1列:

awk '{if(NF==1 && NR!=1){printf("\n%s",$0)} else{printf("%s",$0)}}' file

答案 1 :(得分:1)

awk 解决方案:

awk 'BEGIN{ t="" }NR>1 && NF==1{ print t > "file"++c; t="" }
     { t=(t!="")? sprintf("%s  %s",t,$0) : sprintf("%s",$0) }
     END{ if (t) print t > "file"++c }' file

结果:

> cat file1
0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  0.00000000E+00  
> cat file2
0.93071889E-02  0.14952319E-13  0.55746201E-11  0.89816722E-11  0.46833532E-11  0.14964636E-13  -0.92995325E-47  0.79969902E-46  0.00000000E+00 -0.21442451-105 -0.86924526E-93  0.00000000E+00 -0.85777333E-93  0.48179949-102  0.00000000E+00
> cat file3
0.18614378E-01  0.12050471E-12  0.44928328E-10  0.72404536E-10  0.37744496E-10  0.12066634E-12  0.25848493E-36 -0.13804858E-35  0.56376226E-83  0.20648121E-74 -0.89608567E-66  -0.20861629E-76 -0.87854256E-66 -0.23574755E-73 -0.73275846E-82

答案 2 :(得分:1)

如果您尝试在单个文件中编写输出,这是一个可行的bash单行程序:

IFS=' ' read -r -a array <<< $(cat results|tr -s ' ' |tr -d '\n'); while test "${#array[@]}" -ge "1"; do for i in {1..15}; do echo -n ${array[0]}; array=("${array[@]:1}"); done; echo; done > results_formatted