我需要一个脚本的帮助,该脚本将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中省略
由于
答案 0 :(得分:2)
此awk
应该有效:
awk -v RS= -v ORS='\n\n' 'NR==FNR{a[$0]++;next}!($0 in a)' file2 file1
RS
变量来打开段落模式。 a
的键。
$ 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{$_};
}