我有一个文件,其中包含大量数据:
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可能?)
谢谢!
答案 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