Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将数字块排序为列_Bash_Sorting - Fatal编程技术网

Bash 将数字块排序为列

Bash 将数字块排序为列,bash,sorting,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.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.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?)


谢谢

如果您的数据从来没有两行相邻且包含一列:

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

如果您的数据从来没有两行相邻且包含一列:

awk '{if(NF==1 && NR!=1){printf("\n%s",$0)} else{printf("%s",$0)}}' file
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  


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  



如果您试图在单个文件中写入输出,这是一个bash-one命令行程序,可以工作:

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

IFS=''read-r-a数组如果您试图在单个文件中写入输出,这是一个bash-one命令行程序,可以工作:

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

IFS=''read-r-a数组这个问题对我来说非常不清楚。22个号码?我看到的是一个数字,后面跟着5+5+4个数字(14)。两个期望的输出都不清楚:每行15个数字?我编辑了我的帖子。这个问题对我来说非常不清楚。22个号码?我能看到的是一个数字,后面是5+5+4个数字(14)。所需的输出都不清楚:每行15个数字?我编辑了我的帖子,在
echo-n${array[0]}
之后添加了一个
echo-n”“
,以便在每个数字之间有一个空格。你能解释一下数组=(“${array[@]:1}”)
?另一个问题:我的文件大小约为25mb,这使得这种方法非常缓慢。这是因为读取数组命令吗?${array[@]:1]“表示数组的元素从1开始,而数组是基于0的,我们刚刚使用了元素0。当然,速度方面,我们必须考虑到bash是一个shell,它不是一个“优化的数据处理语言解释器”。我总是在perl中查找类似的内容,我的答案只是一个练习。我在
echo-n${array[0]}
之后添加了一个
echo-n”“
,以便在每个数字之间有一个空格。你能解释一下
array=(“${array[@]:1}”)
?另一个问题:我的文件大小约为25mb,这使得这种方法非常慢。这是因为读取数组命令吗?${array[@]:1]“表示数组的元素从1开始,而数组是基于0的,我们刚刚使用了元素0。当然,速度要考虑到bash是一个shell,而不是“优化的数据处理语言解释器”。我总是在perl中寻找类似的东西,我的答案只是一个练习。