2016-10-08 16 views
2

助けてください。あるべきcsvファイルのyyyymmddをmm/dd/yyyyに変換してください

1231,aaa,bbb,20161001,20161002,hi-ax 
1231,aaa,ccc,20161002,20161003,hi-ay 
1231,aaa,ddd,20161001,20161007,hi-az 

そして出力::私は以下のレコードを持つsample.csvファイルのUNIXシェルコマンドを必要とする

1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax 
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay 
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az 

は、誰かがこのコマンドを修正することはできますか?私にそれを試してみたが、それは区切り文字なしでは動作しません。

awk -F, '{split($4,a,"");$4=a[2]"/"a[3]"/"a[1]}1' OFS=, sample.csv > output.csv 

答えて

3

私はむしろこのような何かのために機能して行くだろう、それはより保守になり、例えば:

変換、日付.AWK

function ruin_utc(d) { 
    year = substr(d, 1, 4) 
    month = substr(d, 5, 2) 
    day = substr(d, 7, 2) 
    return month "/" day "/" year 
} 

あなたは今、このような関数を使用することができます。

awk -f convert-date.awk -e '{ $4 = ruin_utc($4); $5 = ruin_utc($5) } 1' FS=, OFS=, sample.csv 

以上のポータブル:このような

変換-date2.awk

function ruin_utc(d) { 
    year = substr(d, 1, 4) 
    month = substr(d, 5, 2) 
    day = substr(d, 7, 2) 
    return month "/" day "/" year 
} 
{ $4 = ruin_utc($4); $5 = ruin_utc($5) } 
1 

実行して:

awk -f convert-date.awk FS=, OFS=, sample.csv 

出力:gensubのためのGNU AWKで

1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax 
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay 
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az 
+0

私は関数とコマンドを同時に実行していて、エラーが発生しています:構文エラー: '( 'は期待されません。または私はそれを間違って実行しているかもしれない...どのように? – xoxopepper

+0

私たちのシステムでは機能が動作しないと知らされました... – xoxopepper

+0

@xoxopepper: 'convert-date.awk'ファイルに引用符の間にスクリプトを置くと動作しますか?どのバージョンのawkを使用していますか – Thor

2

():

$ cat tst.awk 
BEGIN { FS=OFS="," } 
function cvt(dt) { return gensub(/(....)(..)(..)/,"\\2/\\3/\\1",1,dt) } 
{ $4=cvt($4); $5=cvt($5); print } 

$ awk -f tst.awk file 
1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax 
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay 
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az 
関連する問題