2016-09-20 9 views
0

を解析するために、私は、次の形式でデータをcsvファイルを処理するためのシェルスクリプトを使用しています:シェルスクリプトは、日付

YYYY-MM-DD、値

を各行は別の日付と異なってい値。

YYYY、WEEKNUM、YYYY-MM-DD、yyyyはその行日から4桁の年である値

:私は、次の新しい形式にそれぞれの行を解析したい

weeknumはその日、月、および年の週番号です。

私は例として、2016年2月1日に日付をハードコードされたWEEKNUM、取得するにはdateコマンドを使用して働いてきた:

echo $(date -j -f '%Y-%m-%d' '2016-02-01' '+%V') 

をしかし、私はちょうどかどうかはわかりませんこの日付コマンドをsedのようなものに組み込むと、ファイル内のその行の実際の日付の値に基づいて、yyyyとweeknumの値を各行に動的かつグローバルに挿入できます。

今後の進め方についてご意見をお寄せください。これが行う可能性があります

シャロン

+1

私たちはテストを実行し、あなたが探している結果であることを確信できるように、期待される出力をいくつか提供してもらえますか? – ghoti

答えて

2

$ uname -sr 
Darwin 15.4.0 
$ cat inp 
2016-01-01, 5 
2016-01-09, 15 
2016-02-01, 3.14 
$ while IFS=", " read d v; do date -j -f '%Y-%m-%d' "$d" "+%Y, %V, %F, $v"; done < inp 
2016, 53, 2016-01-01, 5 
2016, 01, 2016-01-09, 15 
2016, 05, 2016-02-01, 3.14 

これはサブシェルまたは一時的な変数の必要性を回避、dateコマンドの形式にすべてをポップ。

引用符の選択に注意してください。書式文字列は通常静的であるとみなされ、通常は一重引用符で囲まれますが、変数$vを書式に含める場合は、代わりに二重引用符を使用して変数展開を行わなければなりません。何らかの理由でCSVの入力データが「ダーティ」である場合は、dateの最初のフィールドを解析する機能以外の入力チェックが行われないため、処理が簡単に中断される可能性があります。


UPDATE

あなたがMacportsまたはBrew、を使用して、システム上でGNUのawk(gawkの)をインストールした場合、次の可能性が高いパフォーマンスが向上します:

gawk 'BEGIN{OFS=FS=", "} {split($1,a,"-"); print a[1],strftime("%V",mktime(gensub(/-/," ","g",$1) " 00 00 00")),$1,$2}' inp 

I 1つのライナーとしてこれを書いたが、私は簡単な説明のためにポイントを打ち破るだろう。

  • BEGIN { OFS=FS=", " } - スクリプトの先頭にフィールドセパレータを定義します。
  • { - このawkスクリプトの主要部分は "条件"を持たないので、すべての入力行に対して実行されます。
  • split($1,a,"-") - 最初のフィールドをハイフンで区切られた配列a[]に分割します。
  • print a[1], - 印刷出力、今年から始まる、
  • strftime("%V",は - 週-の年のための時刻形式に続いて、
  • mktime(gensub(/-/," ","g",$1) " 00 00 00")) - mktime関数の "datespec" の形式で解析された時点から発生した、
  • ,$1,$2} - その他の2つのフィールドが続きます。

私はパフォーマンスの指標を開発していないが、私は自己完結型のgawkのオプションは、入力の行ごとにdateコマンドを生成しますbashのベースのオプションよりもかなり速く実行されます確信しています。

+0

'-r'を使わないで読むとバックスラッシュがマングルされます... –

+0

@ l'L'l - OPによって記述された入力データにバックスラッシュはありませんでした。 – ghoti

+0

@ l'L'I - ファイル内のデータはきれいです。私は例外処理について心配する必要はありません。 – SharonG

関連する問題