使用 grep awk sed 按标题合并文本文件

使用 grep awk sed 按标题合并文本文件

我正在尝试将多个文件合并为一个最终文件。每个文件中都有许多条目,其中大多数条目的标题重叠。我想在标题下合并两者之间的内容。考虑将两个词典结合起来,这样会更有意义。两者都可以找到单个单词的条目,但每个单词的定义略有不同。有些条目存在于一个条目中,而另一个条目中不存在,等等。

例如,我想合并这两个文件以生成一个输出文件:

文件1

Entry 1
Green Trees
Entry 3
Orange Fibers

文件2

Entry 1
Red Trees
Entry 2
Spotted Zebras
Entry 3
Blue Fibers

输出文件

Entry 1
Green Trees
Red Trees
Entry 2
Spotted Zebras
Entry 3
Orange Fibers
Blue Fibers

请注意,条目 2 并不存在于文件 1 中,但已出现在最终产品中。同样,每个条目的内容都会在条目 ID 匹配的任何位置进行合并。

我怎样才能做到这一点?

编辑:以上是提出问题的简化版本。以下是文件中实际条目的示例。

$$$00001是条目标题。

来自文件1

$$$00001
<b><br>- Original: Α<b><br></b></b>- Transliteration: A<b><br></b></b>- Phonetic: al'-fah<b><br></b></b>-...
$$$00002
<b><br>- Original: script<b><br></b></b>- Translitera...

来自文件2

$$$00001
<b><br>α<b><br></b></b>a; indeclinable...
$$$00002
<b><br>texts<b><br></b></b>A...

答案1

一个简单的awk单行解决了你的例子:

awk '/^Entry/{k=$0;next}{g[k]=g[k]"\n"$0}END{for(k in g)print k g[k]}' file1 file2

我想您知道基本上是awk根据程序逐行处理输入行。这个特定的awk程序被指定为第一个参数,由三个语句组成。我们来一一分析:

  • /^Entry/{k=$0;next}方法:如果处理后的行匹配/^Entry/,则将其存储在变量中k并忽略以下语句进入下一个循环。

  • {g[k]=g[k]"\n"$0}没有前置条件,因此它总是被执行,并且意味着:g使用键更新存储在字典中的值k:新值必须是前一个值(可能为空)g[k]、回车符"\n"和当前行的串联。

  • END{for(k in g)print k g[k]}有一个END条件,因此在处理完所有输入行后执行。它说:对于 中的每个键g,即对于输入文件中出现的每个标题,打印关联的值,该值是在该标题下的输入文件中找到的所有行的串联。

要在 IRL 中使用它,您必须替换/^Entry/为正确的模式(可能/^\$\$\$/)。

相关内容