我需要从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...
(没有lineA
– lineC
)
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>