這可能會做:
$ 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
命令的格式,避免了子shell或臨時變量的需要。
請注意選擇引號。雖然格式字符串通常被認爲是靜態的,並且通常放置在單引號中,但如果我們想要在格式中包含變量$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
我把它寫成一行代碼,但是爲了更容易解釋,我會打破這一點。
BEGIN { OFS=FS=", " }
- 在腳本的開頭,定義了一個字段分隔符。
{
- 此awk腳本的主要部分沒有「條件」,因此將針對每一行輸入執行。
split($1,a,"-")
- 將第一個字段拆分爲數組a[]
,用連字符分隔。
print a[1],
- 打印輸出,從全年
strftime("%V",
- 後跟年周的最時間格式,
mktime(gensub(/-/," ","g",$1) " 00 00 00"))
- 從mktime的「datespec」格式解析的時候產生的,
,$1,$2}
- 之後是其他兩個字段。
我還沒有開發的任何性能指標,但我敢肯定的自包含gawk的選項將運行比對輸入的每一行產生一個date
命令基於bash的選項顯著更快。
你能提供一些樣本輸入,與你的目標的預期產出一起,這樣我們就可以運行測試,並且相信他們是你正在尋找的結果? – ghoti