grep awk sedを使用してタイトル別にテキストファイルをマージする

grep awk sedを使用してタイトル別にテキストファイルをマージする

複数のファイルを1つの最終ファイルにマージしようとしています。各ファイルには多くの項目があり、主にタイトルが重複しています。ヘッダーの下の2つの内容をマージしたいと思います。 2つの辞書を組み合わせることを考えると、もっと意味があります。どちらも単一の単語のエントリを見つけることができますが、各単語の定義は少し異なります。一部の項目はある項目にはありますが、他の項目にはありません。

たとえば、次の2つのファイルをマージして1つの出力ファイルを生成したいとします。

ファイル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

あなたの例の簡単なawk1行の解決策は次のとおりです。

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

awk基本的に入力ラインはプログラムによって一行ずつ処理されるという事実はアシリだと思います。この特定のawkプログラムは最初の引数として指定され、3つのステートメントで構成されます。一つずつ分析してみましょう。

  • /^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、つまり入力ファイル内の各ヘッダーに対して、そのヘッダーの下の入力ファイル内のすべての行を連結した関連値を印刷します。

/^Entry/IRLを使用するには、正しいパターン(おそらく)に置き換える必要があります/^\$\$\$/

関連情報