내 CSV 파일의 날짜는 19/10/2014
내가 원하는 형식 입니다 19-Oct-2014
.
답변1
이 date
명령을 사용하면 형식을 지정할 수 있습니다.
date -d "2014-10-19" +%d-%b-%Y
이는
19-Oct-2014
파일의 샘플 라인을 제공하시면 스크립트를 작성해 드릴 수 있습니다.
한 가지 방법은 다음을 사용하는 것입니다 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
두 번째 필드를 수정한다고 가정해 보겠습니다. 날짜가 표시하는 필드(열) 번호를 변경하려면 "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
$