毎日のデータがあります。これを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
次のことができます。tail
xargs
printf
$ 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
。これは必要に応じて調整できます。