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

Posted

技术标签:

【中文标题】在另一个文本文件中存在的文本之后打印特定行【英文标题】:Print specific lines after a text present in another text file 【发布时间】:2013-09-19 03:42:15 【问题描述】:

我有两个文本文件。 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 包含大量数据,并且格式与我提到的相同。我可以使用以下命令对 Text-file-1 中的 Text-file-2 中的文本进行 grep;

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)开头。这封信对我没有用,但我保留了它。请帮忙。

【问题讨论】:

你有没有尝试过?如果是这样,请显示代码并说明它是如何工作的。 不。其实我是编程新手。对于这个问题,我google了很多网站,都没有找到解决办法。 @MuhammadSufian 那么你的目标是先学习编程,然后用你的技能来攻克这个问题。这里没有人有兴趣为您编写代码。我建议你从Perl Tutorial Hub开始。 欧基弗里多。实际上这是我在 *** 上的第一篇文章。我会在星期一尝试我的 linux 命令的基本技能。 【参考方案1】:

这应该可以帮助您入门。如果您是新手,您可能需要学习一些 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

【讨论】:

非常感谢 chansen 提供的脚本。明天我会在我的实验室试一试,然后告诉你。 我今天试过这个脚本,但它没有用。不知道原因。其次,我的数据不同,而且很大。我想在脚本中提及文本文件名,而不是数据。我还在链接perlmonks.org/?node_id=756715 中编写了脚本,但它对我来说太复杂了。 @RobEarl【参考方案2】:
while read str; do sed -n "/^$str/,/^C/ /^$str/p;/^D/p" Text-file-2; done < Text-file-1

这是 sed 命令,由 steeldriver 在另一个论坛提供。而且它工作正常。

【讨论】:

以上是关于在另一个文本文件中存在的文本之后打印特定行的主要内容,如果未能解决你的问题,请参考以下文章

将文本文件中的特定行读取到批处理文件中的变量

linux下如何获得特定字符串前后几行文本

易语言读取文件

在一个功能中添加 2 个逐行文本阅读器

模糊寻找文本行子程序,返回以换行符分隔的文本

在 pdf 文件中查找特定文本并使用文本打印文件名和行