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中寻找类似的东西,我的答案只是一个练习。