:
$ 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のベースのオプションよりもかなり速く実行されます確信しています。
私たちはテストを実行し、あなたが探している結果であることを確信できるように、期待される出力をいくつか提供してもらえますか? – ghoti