我正在尝试将多个文件合并为一个最终文件。每个文件中都有许多条目,其中大多数条目的标题重叠。我想在标题下合并两者之间的内容。考虑将两个词典结合起来,这样会更有意义。两者都可以找到单个单词的条目,但每个单词的定义略有不同。有些条目存在于一个条目中,而另一个条目中不存在,等等。
例如,我想合并这两个文件以生成一个输出文件:
文件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/
为正确的模式(可能/^\$\$\$/
)。