ファイル(例:file1)の「n」行を別のファイルの「n」文字列の下にある別のファイルに追加したいと思います。

ファイル(例:file1)の「n」行を別のファイルの「n」文字列の下にある別のファイルに追加したいと思います。

はい

ファイル1:

This Dog
This Cat
This Duck
This Horse

ファイル2:

...
Animal Name
...

AniMal Type
...

AnIMal Class
...

animal Brand
...

私は次のことをしたいと思います:

  • 「Animal」(大文字と小文字を無視)の最初の項目の下にファイル1(行)の行1を追加します。
  • 2番目に表示される「Animal」(大文字と小文字を無視)の下にファイル1(猫)の行2を追加します。
  • 3番目の「Animal」の下にファイル1(This Duck)の3行を追加します(大文字と小文字を無視)。
  • 4番目の「Animal」項目の下にファイル1(末尾)の4行を追加します(大文字と小文字を無視)。
  • ...

したがって、通常、ファイル1のn行目は、「アニメーション」のn番目の発生(大文字と小文字を無視する)の下に追加する必要があります。

それでは、「sed」、「awk」、またはLinuxの他のコマンドを使用してこれを達成する方法は何ですか?

答え1

GNU sedの使用:

$ sed '/^animal/IR File1' File2
...
Animal Name
This Dog
...

AniMal Type
This Cat
...

AnIMal Class
This Duck
...

animal Brand
This Horse
...

GNU拡張は次のとおりです。

正規表現一致のI修飾子は、正規表現を大文字と小文字を区別せずに一致させるGNU拡張です。

そして

Rファイル名

現在のサイクルの終わりまたは次の入力行を読み取るときに読み取るファイル名行を出力ストリームにキューに追加して挿入します。ファイル名を読み取れない場合、または末尾に達した場合、行は追加されず、エラー表示も表示されません。

答え2

これアッソリューションは次のことを行う必要があります。

awk 'NR==FNR{a[NR]=$0;next};1;tolower($1)=="animal"{print a[++i]}' file1 file2 > file3

NR==FNR{a[NR]=$0;次}file1 データを配列に蓄積し、この段階で file2 が処理されないように、次の入力行にジャンプします。

1file2 の各入力行を印刷します。

tolower($1)=="動物"{print a[++i]}大文字と小文字を区別せずに「動物」と一致し、対応する配列項目を出力し、配列インデックスを事前に増やします。

答え3

file_1の終わりを示すために、.最後の行の後に1つを追加するだけです。なぜなら、1つのファイルが終わり、次のファイルが始まる時点を知っているこれらのさまざまな概念はIOWがないからです。file_1sedsedFNRawksedPOSIX

基本的なアイデアは、動物の名前を保存してhold areaから読み取る時間になると、改行で区切らfile_2れた各部分を取得して読み込み中に追加holdすることです。この練習は、大文字と小文字を区別せずにリテラル文字列を形成する行でのみ機能します。pattern spacedetachholdattach<->detachanimal

sed -e '
   1{
      :file1
         N
      /\n\.$/!bfile1
      s///;h;d
   }

   /^[aA][nN][iI][mM][aA][lL]/!b

   G
   s/\n/&&/2;ta
   b

  :a
   h;s/.*\n\n//;x
   s/\n\n.*//

' file_1 file_2

関連情報