Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在另一个文本文件中的文本后打印特定行_Linux_Perl_Text_Printing - Fatal编程技术网

Linux 在另一个文本文件中的文本后打印特定行

Linux 在另一个文本文件中的文本后打印特定行,linux,perl,text,printing,Linux,Perl,Text,Printing,我有两个文本文件。Text-file-1包含字符串(每行一个字符串) 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 Su

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

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,也许这是一个好的开始。还有一位官员。快乐编程

#!/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};
}
读str时
;do sed-n“/^$str/,/^C/{/^$str/p;/^D/p}”Text-file-2;完成

这是sed命令,由steeldriver在另一个论坛上提供。而且很好用。

你试过什么吗?如果是这样,请展示代码并解释它是如何工作的。实际上我是编程新手。对于这个问题,我搜索了很多网站,但找不到解决方案。@MuhammadSufian那么你的目标是先学习编程,然后用你的技能来解决这个问题。这里没有人对为您编写代码感兴趣。我建议你们从奥基·弗里多开始。实际上,这是我第一次向Stackoverflow发帖。周一我将尝试我的linux命令基本技能。非常感谢chansen的脚本。我明天会在我的实验室里尝试,然后会让你知道。我今天已经尝试了这个脚本,但它不起作用。不知道原因。第二,我的数据不同,而且很大。我想提到脚本中的文本文件名,而不是数据。我还在链接中编写脚本,但对我来说太复杂了@罗伯
#!/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
while read str; do sed -n "/^$str/,/^C/ {/^$str/p;/^D/p}" Text-file-2; done < Text-file-1