各行の値をn回繰り返すには? [コピー]

各行の値をn回繰り返すには? [コピー]

毎日のデータがあります。これを24時間のデータにコピーして、時間ごとの時間間隔の値を同じにしたいと思います。私のデータは次のとおりです。

day       Value
01/01/2012  2
01/02/2012  3

その後、出力は次のようになります。

Day   Value
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
.
.
.

01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
.
.
.

一日に24回です。

答え1

使用awk:

awk 'NR == 1 {print $0}; NR > 1 {for(i=0;i<24;i++) print $0}' InputFile

答え2

方法1

上記の行をというファイルに入れたら、 と を使ってsample.txt次のことができます。tailxargsprintf

$ cat <(head -1 sample.txt) <(tail -n +2 sample.txt \
    | xargs -I{} printf "{}\n%.0s" {1..25})

詳細

次の種類のファイルがあるとします。

$ more sample.txt 
day       Value
01/01/2012  2
01/02/2012  3

headヘッダー行は次の位置に保持されますsample.txt

$ head -1 sample.txt 
day       Value

tail以下を行います。

$ tail -n +2 sample.txt
01/01/2012  2
01/02/2012  3

xargsファイルから各行を取得してprintf印刷をX回呼び出すと、範囲に応じて{1..25}数が生成されます。

それはcat <(...) <(...)すべてを一つにまとめます。

方法#2

フォームは最初のものと似ていますが、少し異なります。最終的に、出力を設定するためにサブシェルを使用する代わりに、単一のサブシェルを使用してcat個々のコマンドの出力を一緒に接続します。また、whileループを使用して入力ファイルの各行を繰り返すより伝統的なアプローチを使用しますsample.txt。を使用して2行目以上を切り取るのと同じ手法を再利用しますtail

$ (head -1 sample.txt; while read i ; do seq 25 \
   | xargs -i -- echo $i ; done < <(tail -n +2 sample.txt))

形式は次のとおりです。

$ ( ... ; while .... done <(tail ...) )

外部カッコはcat最初の例と同じことを行い、すべての出力を1つにまとめます。

複数のファイル

OPは、1000以上のファイルを処理するために使用できるようにこのソリューションを変更する方法を尋ねました。たとえば、フォームラッパーメソッド#1のコードブロックは、次のような結果を生成します。

#!/bin/bash

for file in *.txt; do
  cat <(head -1 $file) <(tail -n +2 $file | xargs -I{} printf "{}\n%.0s" {1..25}) | tee new_$file
done

その後、名前付きのすべてのファイルを繰り返して名前付き*.txtファイルに書き込みますnew_*.txt。これは必要に応じて調整できます。

関連情報