我有两个文本文件。 Text-file-1 包含字符串(每行一个字符串);

C 010 
C 020 
C 024 
. 
. 
. 

Text-file-2 包含以下格式的数据;

C 005 Carbon 
D Carbon 1 
D Carbon 2 
D Carbon 3 
D Carbon 4 
C 010 Hydrogen 
D Hydrogen 1 
D Hydrogen 2 
C 017 Oxygen 
D Oxygen 1 
C 020 Nitrogen 
D Nitrogen 1 
D Nitrogen 2 
D Nitrogen 3 
C 024 Sulphur 
D Sulphur 1 
D Sulphur 2 
. 
. 
. 

Text-file-1 包含 30 行,但 Text-file-2 包含大量数据,并且格式与我提到的相同。我可以使用以下命令 grep 在 Text-file-1 中找到的 Text-file-2 中的文本;

awk 'NR==FNR { A[$2]=1; next }; A[$2]' Text-file-1 Text-file-2 > filename 

此脚本的输出

C 010 Hydrogen 
C 020 Nitrogen 
C 024 Sulphur 
. 
. 
. 

我想要的输出是;

C 010 Hydrogen 
D Hydrogen 1 
D Hydrogen 2 
C 020 Nitrogen 
D Nitrogen 1 
D Nitrogen 2 
D Nitrogen 3 
C 024 Sulphur 
D Sulphur 1 
D Sulphur 2 
. 
. 
. 

现在,我需要此命令的扩展,它可以打印所有行(以“D”开头),包括此行及其之后。 Text-file-2 中的所有行均以字母(C 或 D)开头。这封信对我来说没有什么用处,但我保留了它。请帮忙。

请您参考如下方法:

这应该可以帮助您入门。如果你是新手,你可能需要学习一些Perl,也许Beginner's Introduction to Perl是一个好的开始。还有官方Perl Programming Documentation 。祝编程愉快!

#!/usr/bin/perl 
use strict; 
use warnings; 
 
open my $numbers, '<', \<<'EOF' or die $!; 
010 
020 
024 
EOF 
 
open my $data, '<', \<<'EOF' or die $!; 
C   005 Carbon 
D     Carbon 1 
D     Carbon 2 
D     Carbon 3 
D     Carbon 4 
C   010 Hydrogen 
D     Hydrogen 1 
D     Hydrogen 2 
C   017 Oxygen 
D     Oxygen 1 
C   020 Nitrogen 
D     Nitrogen 1 
D     Nitrogen 2 
D     Nitrogen 3 
C   024 Sulphur 
D     Sulphur 1 
D     Sulphur 2 
EOF 
 
my %want = map { chomp; $_ => 1 } <$numbers>; 
my $number; 
while (<$data>) { 
    $number = $1 if /\A C \s+ ([0-9]{3})/x; 
    print if $want{$number}; 
} 

输出:

C   010 Hydrogen 
D     Hydrogen 1 
D     Hydrogen 2 
C   020 Nitrogen 
D     Nitrogen 1 
D     Nitrogen 2 
D     Nitrogen 3 
C   024 Sulphur 
D     Sulphur 1 
D     Sulphur 2 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!