1

1 時間ごとに取得したデータ ファイルがいくつかあります。ファイル名は次のようになります。

20120101-00.raw
20120101-01.raw
...
YYYYMMDD-HH.raw

時間単位のファイルを日単位、日単位、月単位などに集約する必要があります。集約スクリプトの構文は次のとおりです。

aggregate output-file input-file1 input-file2 ...

集計のスキーマは次のとおりです。

20120101-[0-2][0-9].raw -> 20120101.raw
201201[0-3][0-9].raw -> 201201.raw
etc.

プロセスを自動化するために Makefile を作成しようとしていますが、完全に行き詰まっています。拡張子の問題に対処する方法がわかりません。ソース ファイルとターゲット ファイルの拡張子が同じです。私が使う:

$(shell find . -type f | grep -e "\.raw1$$" | cut -c 8 | sort -u )

私が生成しなければならないファイルを見つけるために。

4

2 に答える 2

1

このためのスクリプトを作成すると、.raw ファイル名のリストを読み取り、リストをソートし、各ファイル名について最後の 2 桁を削除して短縮名を作成します。この短縮名が以前の短縮名と同じ場合は、短縮された名前が以前の短縮された名前と異なる場合は、リストに最後に追加されたエントリに基づいて出力ファイル名を作成します。出力ファイルがすでに存在し、最後に追加されたエントリよりも新しい場合それ以外の場合は、出力ファイル名と入力ファイルのリストを使用して集計コマンドを実行します。

スクリプトを使用するには、最初にすべての時間別ファイルでスクリプトを実行し、次にすべての日次ファイルで再度実行します (必要に応じて、すべての月次ファイルで再度実行して年次ファイルを生成することもできます)。

概説されたスクリプトにはいくつかの制約があります。

  1. 一度に 1 種類のファイルのリストのみを指定する必要があります (例: Hourly、Daily)
  2. 集約する各グループ内のすべてのファイルが同じディレクトリにある必要があります。または、最初の並べ替えでファイル名の (ディレクトリではなく) ベース名の部分のみを並べ替えキーとして使用する必要があります。
  3. これらがスクリプトの実行中に更新される可能性のあるログ ファイルである場合、aggregate コマンドの実行中にログに記録されたデータが失われる可能性があります。これは、出力ファイルのタイムスタンプ (入力ファイルに対して最新であるかどうかを判断するために使用される) が、開始時刻ではなく、集計終了時刻であるためです。回避策として、集計を開始する前に (出力ファイル名に基づいて) タイムスタンプ ファイルにアクセスし、出力ファイルではなくタイムスタンプ ファイルを使用して、出力ファイルが最新かどうかを判断します。
于 2012-04-06T00:44:17.217 に答える
0

Makeはこの仕事に最適なツールではないというOliCharlesworthに同意します。私は、Perlスクリプトを使用します。ただし、Makeを使用する場合は、それを実行できます。これは、への呼び出しを使用したそれほどひどいハックではありませんsed。少し引き締めることもできますが、読みやすくするつもりです。

FILES := $(shell ls *-??.raw)

DAYS :=   $(sort $(shell ls *-??.raw | sed 's/\(........\).*/\1.raw/'))
MONTHS := $(sort $(shell ls *-??.raw | sed 's/\(......\).*/\1.raw/'))
YEARS :=  $(sort $(shell ls *-??.raw | sed 's/\(....\).*/\1.raw/'))

all.raw: $(YEARS)
    aggregate $@ $^

$(YEARS): %.raw : $(MONTHS)
    aggregate $@ $(filter $*%, $^)

$(MONTHS): %.raw : $(DAYS)
    aggregate $@ $(filter $*%, $^)

$(DAYS): %.raw :
    aggregate $@ $(filter $*%, $(FILES))
于 2012-04-06T13:21:58.090 に答える