私がcsvファイルに書き込んだ日付は2014年10月19日です。形式を2014年10月19日にしたいと思います。

私がcsvファイルに書き込んだ日付は2014年10月19日です。形式を2014年10月19日にしたいと思います。

私のCSVファイルの日付は19/10/2014私が望む形式です19-Oct-2014

答え1

このdateコマンドを使用すると、書式を指定できます。

date -d "2014-10-19" +%d-%b-%Y

これは

19-Oct-2014

ファイルのサンプルラインを提供してスクリプトを作成します。

1つの方法は、次のものを使用することですawk

echo zzz,19/10/2014,aaa,bbb | awk -F, '{split($2,dateelem,"/"); cmd = "date -d " dateelem[3] "-" dateelem[2] "-" dateelem[1] " +%d-%b-%Y"; cmd | getline date; OFS=","; $2=date; print; close(cmd)}'

これは作る

zzz,19-Oct-2014,aaa,bbb

2番目のフィールドを修正するとしましょう。日付が表示するフィールド(列)番号を変更するには、"split($2,dateelem,"/");"スクリプトを調整してください。awk

答え2

完全にGNU awkを使用するソリューションは次のとおりです。

awk '{ split($0,slt,"/");datspec=mktime(slt[3]" "slt[2]" "slt[1]" 00 00 00");print strftime("%d-%b-%Y",datspec) }' <<< "19/10/2014"

日付を入力として使用して、最初にデータを配列(slt)に分割して日、月、年を取得します。次に、awkのmktime関数を使用して日付仕様を取得し、awkのsttftime関数から正しい形式の日付を取得するために使用します。

csvの場合、$ 0は日付を含むカンマ区切りフィールドに対応する数値です。

答え3

Perlはこれを行うことができますが、初心者には適していません。ただし、日付解析は適切な日付処理ライブラリで最もよく処理されます。 PerlボックスにはTime :: Pieceがあります。

$ cat file
a,b,19/10/2014,d

$ perl -MTime::Piece -F, -lane '
    $F[2] = Time::Piece->strptime($F[2], "%d/%m/%Y")->strftime("%d-%b-%Y");
    print join ",", @F
' file
a,b,19-Oct-2014,d

答え4

別のawk方法。基本awk機能を使用しているため、GNUではなく実装で使用できます。

$ cat infile
foo,19/10/2014,bar
foo2,19/01/2015,bar2
$ awk -F, '{print $1","substr($2,0,2)"-"substr("JanFebMarAprMayJunJulAugSepOctNovDec",substr($2,4,2)*3-2,3)"-"substr($2,7,4)","$3}' infile
foo,19-Oct-2014,bar
foo2,19-Jan-2015,bar2
$

関連情報