比较两个文件并在匹配的单词后面打印N行

我需要从File1中searchFile1的名称。 如果find匹配的名字,我需要在它后面用三行打印。

– 文件1 –

 Name1 Name2 Name3 

– 文件2 –

 Topic1 ....description... lineA lineB lineC Name1 ....description... lineA lineB lineC Name3 ....description... lineA lineB lineC Topic2 ....description... lineA lineB lineC Topic3 ....description... lineA lineB lineC 

– 预期结果 –

 Name1 ....description... lineA lineB lineC Name3 ....description... lineA lineB lineC 
  • 我尝试使用awk来查找两个文件之间的匹配,并且只能成功地打印Name1 ....description... (没有lineAlineC

     awk 'BEGIN { while ( getline < "File1" ) arr[$0]++ }( $1 in arr )' File2 
  • 我知道grep命令可以用来使用模式打印某些行

     grep -A3 /pattern/ file 

我现在的问题是我不知道如何结合这两个命令。 也许有人可以build议一个Perl脚本来运行这些stream程?

你可以传递一个包含模式的文件( -f选项),所以

 $ grep -F -f file1 -A3 file2 Name1 ....description... lineA lineB lineC Name3 ....description... lineA lineB lineC 

使用-F来指示模式是固定的字符串,而不是正则表达式。

这应该适合你。 它将File1中的所有名称读入散列,以便可以快速检查File2中的值。

File2是逐行读取的,第一个字段与哈希值进行检查,看它是否是想要的名字之一。 如果是,则打印当前行和下面三行。

 use strict; use warnings; use 5.010; use autodie; my %names; open my $fh, '<', 'File1'; while ( <$fh> ) { chomp; ++$names{$_}; } open $fh, '<', 'File2'; while ( <$fh> ) { my ($name) = split; if ( $names{$name} ) { print; print scalar <$fh> for 1 .. 3; } } 

产量

 Name1 ....description... lineA lineB lineC Name3 ....description... lineA lineB lineC 

我会用xargs:

 cat File1 | xargs -I NAME grep -A3 NAME File2 

在File2中查找NAME的规范方法,显示匹配的行和后面的三行:

 grep -A3 NAME File2 

为文件1的每一行生成这样一个命令的方式,使用行作为NAME是:

 cat File1 | xargs -I NAME <COMMAND with NAME in it>