Linux脚本:使用perl使用If-Else条件插入记录

时间:2014-01-02 03:02:06

标签: linux perl bash shell

我正在开发一个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'。

有人可以帮忙吗?

感谢您的帮助。

2 个答案:

答案 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;
}