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

标签 linux perl shell sed awk

我需要一个以 2 个文件作为输入的脚本方面的帮助:

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

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

即脚本需要在 File2 中搜索 File1 中给定的每个段落。如果找到完美匹配(具有所有匹配行),则从输出文件 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 中省略

谢谢

最佳答案

这个 awk 应该可以工作:

awk -v RS= -v ORS='\n\n' 'NR==FNR{a[$0]++;next}!($0 in a)' file2 file1
  • 我们通过设置RS 变量来开启段落模式。
  • 我们将整个段落作为关键字加载到文件 2 中的数组 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

关于linux - 通过搜索另一个文件从文件中删除匹配段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22650213/

相关文章:

linux - 如何在不显示该目录的情况下使用特定目录的文件路径自动完成 bash 命令行?

linux - 如何用 sed 替换同一文件中的多行?

perl - Perl的postfix `for`语法在哪里记录?

linux - Perl - 基本的 STDIN 问题

c - 从函数指针中减去 1

linux - find 命令不按指定打印扩展名为 .wav 的文件

perl - 如何将我的 Catalyst 应用程序部署为 debian 包(或合适的替代方案)?

shell - 如何在Kubernetes中使用Cron Job运行具有ssh命令的Shell脚本

linux - 放置自定义可执行文件或脚本的 Unix 标准目录?

linux - 如何使用带引号的字段(可能包含分隔符)对 CSV 进行排序