
私の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
$