【问题标题】:Compare two files and print N lines after the matching word比较两个文件并在匹配的单词后打印 N 行
【发布时间】:2015-04-08 07:20:58
【问题描述】:

我需要从 File1 中搜索一个名称,而不是 File2。如果找到匹配的名称,我需要将其与后面的三行一起打印。

— 文件 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
    

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

【问题讨论】:

  • 你听说过 unix 管道吗?
  • err nope..我在这个环境中是全新的
  • unix shell 脚本呢? bash 编程?
  • 是的..还在学习它..我知道基本格式..
  • 我可以认为File 2 中的名称后面总是有一个空格吗?

标签: linux perl awk grep


【解决方案1】:

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

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

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

【讨论】:

  • 感谢格伦杰克曼!!当我在本地 Redhat 上尝试该命令时,该命令运行良好,但是当我在 Redhat 服务器上运行它时,会打印 file2 中的所有内容 :( 知道为什么会这样吗?
  • file1中有空行吗?
【解决方案2】:

这应该适合你。它将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

【讨论】:

    【解决方案3】:

    我会使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2017-07-30
      • 1970-01-01
      • 2016-07-30
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多