2つのファイルをマージします:2行、1行の一部、2行、1行の一部など[閉じる]

2つのファイルをマージします:2行、1行の一部、2行、1行の一部など[閉じる]

こんにちは、私はawk2つのテキストファイルをやや具体的な方法でマージしようとしています。 2行をfile1単語セットfile2 (ただし別々の行にあります)で交互に使用することです。無期限。単語グループはfile2カンマで区切られます。たとえば、

file1

A Partridge in a Pear Tree
Two Turtle Doves
Three French Hens
Four Calling Birds
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

file2

I was born, on Mars, the red planet
I love frogs, they are so tasty, with, ketchup, I am hungry

結果ファイル

A Partridge in a Pear Tree
Two Turtle Doves
I was born
Three French Hens
Four Calling Birds
on Mars
Five Gold Rings
Six Geese a-Laying
the red planet
Seven Swans a-Swimming
Eight Maids a-Milking
I love frogs
Nine Ladies Dancing
Ten Lords a-Leaping
they are so tasty
Eleven Pipers Piping
Twelve Drummers Drumming
with
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
ketchup
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
I am hungry
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

詳細:

  • file1内容に関係なく2行の大連に分かれて
  • in行にはfile2複数のグループを含めることができます(たとえば、カンマの数に制限はありません)。
  • グループはfile2単語数に制限なく含めることができます(0???を含む)。
  • file1長さにfile2制限はありません。
  • あるファイルの終わりに達したが他のファイルにまだデータがある場合は、目的の動作が指定されていません。

どうすればいいですか?

答え1

awk -F ', *' '!skip {for (i = 1; i <= NF; i++) a[++n] = $i; next}
              {print}
              FNR % 2 == 0 && m++ < n {print a[m]}
             ' file2 skip=1 file1

答え2

file22行ごとにカンマの間に文を挿入したい場合は、file1次のawkスクリプトを試してください。

 awk -F", *" 'NR==FNR{
                 for(i=1;i<NF+1;i++)
                    a[i]=$i
              } 
              NR>FNR{
                 print; 
                 if(FNR%2==0) 
                     print a[FNR/2]
              }' file2 file1

答え3

遊ぶアッecord eparator(ここではGNURまたは最新バージョンをS想定)awkmawk

awk '{print}!(NR%2){getline <"file2";print}' RS="\n|, " file1

もし,あればファイル1行のより正確なバージョンは次のとおりです。

awk 'BEGIN{r=RS}{print}!(NR%2){RS=r"|, ";getline <"file2";print;RS=r}' file1

修正された問題は(ポータブル)で解決できます。

awk '{print};!(NR%2) && (getline <"file2")>0{gsub(", *", "\n");print}' file1

答え4

@olivの説明が正しいと仮定すると、このソリューションは以下を使用しなくても機能する可能性がありますawk

paste -d '\n ' file1 <(sed  's/^/\n/;s/, */\n\n/g' file2) | sed '/^$/d'

一方修正するOPの要求によると、これはもはや実行可能なアプローチではないようです。

関連情報