Linux 脚本 : Using perl to insert record using If-Else condition

标签 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:50,然后在 perl 命令中使用该值来打印“## 944”或“## 945”。

有人可以帮忙吗?

感谢您的帮助。

最佳答案

也许以下内容会有所帮助:

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 ' 分隔的记录,并将 block 拆分到一个数组中。然后它使用 substr 检查 50 条记录的第 21 个字符,并使用三元运算符返回保存在 $rec 中的评估结果。最后,打印数组元素和 $rec

关于Linux 脚本 : Using perl to insert record using If-Else condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20875675/

相关文章:

perl - 如何使用 Perl 的 PDF::API2 使复选框在 PDF 中呈现

使用 perl 的 HTML 解析器

perl - 如何分析 Perl Web 应用程序?

linux - 当操作系统等待用户输入时,CPU 是否仍在执行任何指令?

bash - 映射 id 的有效方法

linux - 如何查找变更集所在的版本

Linux/Unix 经验

linux - 如何使用 Bash 读取特定行和特定字段?

c - 执行功能。有没有办法回到主程序?

php - 永久的 cron 作业