特定の間隔に単一のテキストを挿入する方法を知っています。しかし、今私の問題は、あるファイルに保存されている別のテキスト/単語を特定の間隔で別のファイルに挿入したいということですadd.txt
。data.txt
add.txt
最初の単語を特定の場所に挿入し、2番目の単語をdata.txt
次add.txt
の特定の場所に挿入したいと思います。
私の列にはdata.txt
2つの列がありますが、挿入された単語はマージされた行として表示される必要があります。以下の例を参照して、私に必要なものを確認してください。
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.txt
data.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