使用bash从文本中提取数字并转换为CSV格式文件

3

我对使用bash提取数据还很陌生,不知道该搜索哪些关键字来解决我的问题。我想要从一个非常大的日志文件中提取一些变量的数据。

日志文件示例:

temp[min,max]=[   24.0000000000000      ..   834.230000000000      ]
CHANGE working on TEMS
RMS(TEMS)=  6.425061887244621E-002   DIFMAX:   0.896672707535103     
               765                     1                   171
CHANGE working on PHI 
RMS(PHI )=   1.92403467949391        DIFMAX:    62.3113693145351     
               765                     1                   170
CHANGE working on TEMP
RMS(TEMP)=  6.425061887244621E-002   DIFMAX:   0.896672707535103     
               765                     1                   171
PMONI working
TIMSTP working

COPEQE working : INFO
DELT =    630720000.000000      sec       

Courant-Number in x,y,z:
Max. :   5.05    ,      0.00    ,      6.93    
Min. :   0.00    ,      0.00    ,      0.00    
Avg. :  0.568E-02,      0.00    ,     0.383    
PROBLEM: Courant-Number(s) greater than 1 :   11.9802093558263     
max. TEMP-Peclet in X:                     653                     1
               170
max. TEMP-Peclet in Y:                     653                     1
               170
Temperature-Peclet-Number in x,y,z:
Max. :  0.357    ,      0.00    ,     0.313E-01
Min. :   0.00    ,      0.00    ,      0.00    
Avg. :  0.307E-03,      0.00    ,     0.435E-03
Temperature-Neumann-Number in x,y,z:
Max.:   64.9    ,    64.9    ,    64.9    
Min.:  0.619E-02,   0.619E-02,   0.619E-02
Avg.:   35.5    ,    35.5    ,    35.5    
PROBLEM: Temp-Neumann-Number greater than 0.5 :   194.710793368065     
(Dominating: Courant-Number)
DRUCK working
KOPPX working
#########################################################################
STRESS PERIOD:                      1                        1   
                 1  of                    100   <<<<<
Time Step:      50 (  1.0% of 0.315E+13 sec       )(0.631E+09 sec       )
#########################################################################

### Continues on ###

我使用bash成功地提取了与我所寻找的变量相关的行。

grep -A 3 'Courant-Number in x,y,z' logfile.log > courant.txt
grep -A 2 'Max.' courant.txt > courant.txt

要获得这个...

  Max. :  0.146E+04,      0.00    ,     0.169E+04
  Min. :   0.00    ,      0.00    ,      0.00    
  Avg. :   1.15    ,      0.00    ,     0.986    
--
  Max. :  0.184E+04,      0.00    ,     0.175E+04
  Min. :   0.00    ,      0.00    ,      0.00    
  Avg. :   1.13    ,      0.00    ,      1.05    
--
  Max. :  0.163E+04,      0.00    ,     0.172E+04
  Min. :   0.00    ,      0.00    ,      0.00    
  Avg. :   1.13    ,      0.00    ,      1.17  

我想将这些数据转换为CSV文件,其中包含以下列,共计9列。
Max_x | Max_y | Max_z | Min_x | Min_y | Min_z | Avg_x | Avg_y | Avg_z
我想继续使用bash来获取这些数据。非常感谢您的任何建议。
谢谢!

仅返回翻译后的文本:显示原始数据也一样 - 123
根据123的建议,添加了原始数据。 - quenchlemon
1个回答

4

你已经有了一个良好的开端。我之前的解决方案要差得多,但是后来我学会了 paste -d 这个命令。

grep -A 3 'Courant-Number in x,y,z' logfile.log |
    grep -A 2 'Max.' |
    grep -v -- '--' |
    sed 's/^.*://' |
    paste -d "," - - - |
    sed 's/ *//g'
  • 找到 courant number + 3 行
  • 找到 max + 2 行
  • 删除包含“- -”的行
  • 删除“min: max: avg:”
  • 每三行用逗号连接起来
  • 删除空格

真令人印象深刻...我原本想到了一个awk方案,那会更加复杂。 - Hambone
谢谢!我的第一次尝试中有大约三个管道。像这样的事情有很多方法... - 22degrees
感谢您的帮助SCF。我可以确认该函数有效。 - quenchlemon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接