特定の間隔で同じテキストファイルに別のテキストを追加/挿入しますか?

特定の間隔で同じテキストファイルに別のテキストを追加/挿入しますか?

特定の間隔に単一のテキストを挿入する方法を知っています。しかし、今私の問題は、あるファイルに保存されている別のテキスト/単語を特定の間隔で別のファイルに挿入したいということですadd.txtdata.txt

add.txt最初の単語を特定の場所に挿入し、2番目の単語をdata.txtadd.txtの特定の場所に挿入したいと思います。

私の列にはdata.txt2つの列がありますが、挿入された単語はマージされた行として表示される必要があります。以下の例を参照して、私に必要なものを確認してください。

add.txt

2001-01-01 00:00:00 42 1
2001-01-02 00:00:00 42 1
2001-01-03 00:00:00 42 1
2001-01-04 00:00:00 42 1
2001-01-05 00:00:00 42 1

data.txt

  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

私の考えでは

2001-01-01 00:00:00 42 1 
 -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-04 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

awk私は、または同様のものを使用する最も簡単なソリューションを探していますsed

答え1

$ awk '(FNR-1)%4 == 0 { getline add <"add.txt"; print add }; 1' data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

awkこれはファイルの各行を読み書きするために使用されますdata.txt。 4行目を出力する前に、ファイルから1行を読み込んで出力しますadd.txt

読み取ったデータがadd.txt正しく読み取られたことを確認するためのチェックは行われません(ファイルが短すぎると、上記のコードは最後の行を繰り返します)。


使用paste:

$ paste -d '\n' add.txt - - - - <data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

ここでは、最初のフィールドの1行と次の4つのフィールドの4行をpaste使用してレコードを作成するように要求します。フィールド区切り文字として使用される文字を改行文字に設定しました。add.txtdata.txt-d '\n'

答え2

GNU sed特にMacOSの場合、これがオプションであれば、次のsedコードを実行できます。 GNUによって追加されたRコマンドと〜コマンドはここで重要です。

~ は、sed が 4 行目ごとに具体的に見えるようにし、他の行の場合は標準出力に渡されます。 Rはadd.txtから行を取得し、data.txt行と混合する必要があります。

$ sed '
    1~4!b
    R add.txt
    $!N
' data.txt

答え3

IMHO、最も簡単な方法は、add.txtを配列として読み込み、配列からdata.txtの4行ごとに印刷することです。

$ awk 'NR==FNR{a[NR]=$0; next} FNR%4==1{print a[++c]} 1' add.txt data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

関連情報