我正在开发一个Linux bash脚本,我正在尝试使用perl根据文件中的特定值在数据文件中插入记录。
示例:我有一个包含记录的数据文件:00,50,51和52.
00 714
50OSDK10026-326455 NCIBLEX
51PO PO456
52GRW000000003200000
00 148
50OSDK15432-156831 HCIBLEX
51PO PO123
52GRW000000001500000
00 577
50OSDK19932-157431 SCIBLEX
51PO PO899
52GRW000000001500000
记录50中的位置#21分别包含值:N,H和S.如果值= H,那么我想在记录00上面插入记录“##”,值为:945,否则我想在记录00上面插入记录“##”,其值为:944。所以最终文件应该看起来像这样:
## 944
00 714
50OSDK10026-326455 NCIBLEX
51PO PO456
52GRW000000003200000
## 945
00 148
50OSDK15432-156831 HCIBLEX
51PO PO123
52GRW000000001500000
## 944
00 577
50OSDK19932-157431 SCIBLEX
51PO PO899
52GRW000000001500000
我可以使用perl在“00”记录上面插入“##”记录,如下所示:
perl -i -pnle "print '## 944' if(/^00/);" datafile
但是,我不知道如何检查pos:21 in record:50,然后在perl命令中使用该值来打印'## 944'或'## 945'。
有人可以帮忙吗?
感谢您的帮助。
答案 0 :(得分:1)
也许以下内容会有所帮助:
use strict;
use warnings;
local $/ = '00 ';
while (<>) {
chomp;
my @arr = split /\n/ or next;
$arr[0] = $/ . $arr[0];
my $rec = ( substr $arr[1], 20, 1 ) eq 'H' ? '## 944' : '## 945';
print +( join "\n", $rec, @arr ), "\n";
}
用法:perl script.pl inFile [>outFile]
最后一个可选参数将输出定向到文件。
该脚本读入由'00 '
分隔的记录,并将split
块作为数组。然后使用substr
检查50记录的第21个字符和三元运算符,以返回保存在$rec
中的评估结果。最后,打印数组元素和$rec
。
答案 1 :(得分:1)
这是一个可以满足您要求的单线程,但它不是很强大。它假定50条记录(如果存在)立即跟随00记录。它还将整个文件作为单个字符串(即-0777
选项)啜饮,因此假设输入文件不是太大。
# Shown on multiple lines for readability.
perl \
-0777 \
-pe \
's/^(00.+?\n50.{18}(.))/$n = $2 eq "H" ? 944 : 945; "## $n\n$1"/gem' \
datafile
更好的方法是编写一个小的解析脚本。
use strict;
use warnings;
while (my $line = <>) {
if ($line =~ /^00/) {
my $fifty = <>;
my $n = substr($fifty, 20, 1) eq 'H' ? 944 : 945;
$line = "## $n\n$line$fifty";
}
print $line;
}