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)
这可能对你有用:
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)
我在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)
(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)
应该这样做(假设行号不是原始文件的一部分)。
华泰
| 归档时间: |
|
| 查看次数: |
11225 次 |
| 最近记录: |