根据文件内容和模式匹配拆分文件

Dea*_*ean 13 linux bash perl pattern-matching

我需要你的帮助,使用bash/linux格式化一个txt文件.该文件如下所示,它总是有一行名为Rate:Sth然后它以非常特定的格式显示详细信息.我想为每个文件以一个速率拆分文件.在这个例子中,我想要有3个文件,每个文件都有相应的行表示Rate值是什么.

你将如何处理这个问题?

line No. Main Text
1    Rate: GBP
2    12/01/1999,90.5911501,Validated
     .....
     .....
210  18/01/1999,90.954996,Validated
211  Rate: RMB
212  24/04/2008,132.2542,Validated
     .....
1000 25/04/2008,132.2279,Validated
1001 28/04/2008,131.69915,Validated
1002 Rate: USD
1003 21/11/11,-0.004419534,Validated
Run Code Online (Sandbox Code Playgroud)

pot*_*ong 8

这可能对你有用:

csplit -z -f 'temp' -b '%02d.txt' file /Rate/ {*}
Run Code Online (Sandbox Code Playgroud)

这将生成文件temp00.txt,temp01.txt ...

如果你只想要那条Rate线;

sed -i '/Rate/!d' temp*.txt
Run Code Online (Sandbox Code Playgroud)


seh*_*ehe 5

我在perl中这样做:

#!/usr/bin/perl

use strict;
use warnings;

open (my $out, ">-") or die "oops";

while(<>)
{
    if (m/^Rate: (\w+)/o)
    {
        close $out and open ($out, ">$1") or die "oops";
        next;
    }

    print $out $_
}
Run Code Online (Sandbox Code Playgroud)

像它一样使用它

perl ./test.pl input.txt
Run Code Online (Sandbox Code Playgroud)

  • 聪明的第一次开放允许简洁的循环.非常好. (2认同)

Zso*_*kai 5

(g)awk救援:

awk '/^Rate:/ {output_file_name=$2; getline } 
     { print $0 >> ( output_file_name ) }' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)

第一条规则和命令针对以输出文件名开头Rate:且仅设置输出文件名的行执行,然后从输入文件获取下一行。然后处理下一行并将其写入输出文件。之后,下一行仅由第二个命令处理(写入输出文件),但前提是它不匹配Rate:

注意:如果输入文件中的某个部分包含两行连续的Rate:s,则上述解决方案可能会失败,如下所示:

... DATA ...
Rate: GBP
Rate: CHF
... DATA ...
Run Code Online (Sandbox Code Playgroud)

应该这样做(假设行号不是原始文件的一部分)。

华泰