2016-04-11 37 views
1

我正在自動生成一些以.csv格式生成的數據,並且我在使用數據值格式化字段時遇到困難。請幫助我。如何在Unix中更改每行數據的日期格式?

我有一個.csv文件中的以下數據:

April 3 2016 FL 03112017 0 
April 4 2016 CA 04022016 0 
April 5 2016 TX 04302016 0 
April 6 2016 OH 05292016 0 
April 7 2016 AZ 06092016 0 
April 8 2016 MA 06252016 0 

我想創建文件如下:

2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 

我已經用awk試了一下,像這樣的東西:

awk -F "\t" '{print "date -d "$1" +'%Y-%m-%d'",$2,$3}' file.csv > file1.txt 

這是行不通的。我無法將結果/計算的值分配給必須打印的$ 1。

+0

[在AWK轉換日期]的可能的複製(http://stackoverflow.com/questions/2121896/converting-dates-in-awk) – bufh

+0

不,它不是一個DUP因爲這個樣本輸入含有那一年。另外,在這個問題中選擇的答案並不是很好,因爲第一個腳本不必要地產生一個子shell,並在文件中的每一行都調用一個shell工具,當它需要做的就是計算一年,然後打印出來在每行上洗牌,第二個答案錯誤地使用'getline'(沒有測試/保護失敗)。 –

回答

2

需要,只是洗牌的文字沒有註明日期的功能:

$ awk ' 
    BEGIN{m="JanFebMarAprMayJunJulAugSepOctNovDec"} 
    {printf "%04d-%02d-%02d %s %s %s\n",$3,(match(m,substr($1,1,3))+2)/3,$2,$4,$5,$6} 
    ' file 
2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 
+1

謝謝@Ed Morton。這工作。如果我可以在'awk'命令中使用日期格式(使用日期命令,就像我在前面提到的代碼中那樣),可以讓我知道嗎?這將幫助我進行其他需要做的操作。 – Jonathan

+0

不客氣。是的你可以,但如果你有GNU awk,那麼你不必因爲[gawk有它自己的時間函數](http://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions) 。通過使用'-d'選項來判斷你使用的是GNU日期,所以你也應該使用GNU awk。 –

+0

嘿,這段代碼很有用,但是我在使用這個時遇到了一些分隔符問題。輸入文件是製表符分隔的,輸出文件也必須以製表符分隔。我嘗試了不同的代碼來生成一個製表符分隔的文件,但我無法做到。你能幫我解決這個問題嗎? – Jonathan

1

在這裏,我使用date生成月份名稱:不是絕對必要的。

awk -v monthNames="$(for m in $(seq 1 12); do date -d "$m/1" +%B; done | paste -sd,)" ' 
    BEGIN { 
     split(monthNames, mn, ",") 
     for (i=1; i<=12; i++) m[mn[i]] = i 
     delete mn 
     FS = OFS = "\t" 
    } 
    { 
     split($1, d, " ") 
     $1 = sprintf("%d-%02d-%02d", d[3], m[d[1]], d[2]) 
     print 
    } 
' file.csv