通过搜索另一个文件从文件中删除匹配的段落

时间:2014-03-26 02:12:18

标签: linux perl shell sed awk

我需要一个脚本的帮助,该脚本将2个文件作为输入:

File1: [TEXT] contains Paragraphs SEPARATED with BLANK LINES
File2: [SEARCH KEYS] Paragraphs SEPARATED with BLANK LINES

并创建一个输出文件:File3 - 其中包含来自File1的TEXT,除了那些与File2中提供的那些完全匹配的PARAGRAPHS。

即。脚本需要搜索File1中的每个段落 - 在File2中。如果找到完美的匹配(带有所有匹配线),则从输出文件3中删除匹配段落。

鉴于:2个文件

File1:

PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

PARA2_LINE1
PARA2_LINE2

PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

File2:

PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

PARA2_LINE1

必需输出:

File3:

PARA2_LINE1
PARA2_LINE2

注意:第二段[PARA2]不是一个完整的匹配,因此不应该从文件3中省略

由于

2 个答案:

答案 0 :(得分:2)

awk应该有效:

awk -v RS= -v ORS='\n\n' 'NR==FNR{a[$0]++;next}!($0 in a)' file2 file1
  • 我们通过设置RS变量来打开段落模式。
  • 我们从file2加载整个段落作为数组a的键。
  • 如果在file1中找到的段落,我们会将其打印出来。

$ cat file1
PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

PARA2_LINE1
PARA2_LINE2

PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

$ cat file2
PARA1_LINE1
PARA1_LINE2
PARA1_LINE3

PARA2_LINE1

$ awk -v RS= -v ORS='\n\n' 'NR==FNR{a[$0]++;next}!($0 in a)' file2 file1
PARA2_LINE1
PARA2_LINE2

答案 1 :(得分:1)

利用输入记录分隔符$/以段落模式处理。注意,我没有chomp,因为最后一条记录可能只有一次返回。

use strict;
use warnings;

if (@ARGV != 2) {
    print "Usage: $0 [Text File] [Search Key File]\n";
    exit;
}

my $file1 = shift;

local $/ = "\n\n";

my %para;
while (<>) {
    s/\n+$//;
    $para{$_} = 1;
}

local @ARGV = $file1;
while (<>) {
    s/\n+$//;
    print $_,$/ if ! $para{$_};
}