微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-根据取自文本文件的模式将文本文件拆分为多个部分

我有许多固定宽度数据的文本文件,例如:

$head model-q-060.txt 
% x                      y                        
15.0                     0.0                      
15.026087                -1.0                     
15.052174                -2.0                     
15.07826                 -3.0                     
15.104348                -4.0                     
15.130435                -5.0                     
15.156522                -6.0                     
15.182609                -6.9999995               
15.208695                -8.0  

数据包含3或4次模拟运行,所有运行都存储在一个文本文件中,两次运行之间没有分隔符.换句话说,没有空行或任何东西,例如如果每次运行只有3个“记录”,那么3次运行将看起来像这样:

$head model-q-060.txt 
% x                      y                        
15.0                     0.0                      
15.026087                -1.0                     
15.052174                -2.0                     
15.0                     0.0                      
15.038486                -1.0                     
15.066712                -2.0                     
15.0                     0.0                      
15.041089                -1.0                     
15.087612                -2.0                     

对于那些感兴趣的人来说,这是一个COMSOL Multiphysics输出文件.在视觉上,您可以知道新的运行数据从何处开始,因为第一个x值被重复(实际上,所有第二行的所有值都相同).因此,我需要首先打开文件获取此x值,将其保存,然后将其用作与awk或csplit匹配的模式.我正在努力解决这个问题!

csplit将完成这项工作:

$csplit -z -f 'temp' -b '%02d.txt' model-q-060.txt /^15\.0\\s/ {*}

但我必须知道要分割的模式.这个问题是相似的,但是我的每个文本文件都可能具有不同的模式来匹配:Split files based on file content and pattern matching.

解决方法:

这是一个简单的awk脚本,它将执行您想要的操作:

BEGIN { fn=0 }
NR==1 { next }
NR==2 { delim=$1 }
$1 == delim {
    f=sprintf("test%02d.txt",fn++);
    print "Creating " f
}

{ print $0 > f }

>初始化输出文件
>忽略第一行
>从第二行提取定界符
>对于第一个标记与定界符匹配的每个输入行,设置输出文件
>对于所有行,写入当前输出文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐