我有两个文本文件。 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)开头。这封信对我没用,但我保留了它。请帮助。
答案 0 :(得分:3)
这应该让你开始。如果你是新手,你可能需要学习一些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
答案 1 :(得分:0)
while read str; do sed -n "/^$str/,/^C/ {/^$str/p;/^D/p}" Text-file-2; done < Text-file-1
这是sed命令,由steeldriver在另一个论坛上提供。它的工作正常。