파일의 날짜 형식을 변환하는 방법

파일의 날짜 형식을 변환하는 방법

입력 파일:3개의 열이 포함되어 있으며, 세 번째 열은 샘플 데이터 DD-MMM-YYYY형식
의 날짜 입니다.

1232,abdc, 02-Jan-2014
4534,kdafh, 20-Feb-2014
364,asjhdk, 11-Jul-2012

원하는 출력:

1232,abdc, 2014-01-02
4534,kdafh, 2014-02-20
364,asjhdk, 2012-07-11

날짜 기능 사용: date -d 20-DEC-2014 +%Y-%m-%d
awk 명령을 사용하여 오류를 발생시키는 다른 방법이 있습니까
?

답변1

입력 파일이 input-file.txt이고 출력 파일이 output-file.txt라고 가정할 때 awk를 사용하여 가능한 대답 중 하나는 다음과 같습니다.

awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d "$3" +%Y-%m-%d");}' input-file.txt > output-file.txt

답변2

사용밀러( mlr) 헤더 없는 CSV 입력에서 과도한 공백을 정리한 후 세 번째 필드를 다시 작성합니다. 시간 형식 문자열을 사용하여 strptime()지정된 날짜를 구문 분석한 %d-%b-%Y다음 형식 문자열 strftime()( 예를 들어 대신 %F사용할 수 있음 )을 사용하여 결과 Unix 타임스탬프의 형식을 다시 지정하여 세 번째 필드를 다시 작성합니다 .%Y-%m-%d%F

mlr --csv -N \
    clean-whitespace then \
    put '$3 = strftime(strptime($3,"%d-%b-%Y"),"%F")' file

질문의 데이터가 주어지면 다음이 출력됩니다.

1232,abdc,2014-01-02
4534,kdafh,2014-02-20
364,asjhdk,2012-07-11

데이터의 동일한 필드에 타임스탬프가 있는 경우 에 사용된 형식 문자열을 조정 strptime()하고 strftime()필요에 맞게 호출할 수 있습니다.

strftime이러한 형식 문자열의 의미와 날짜 및 시간 형식 지정 옵션은 시스템 설명서를 참조하세요 .

답변3

입력한 텍스트가 다음과 같다고 가정합니다.

1232,abdc, 02-Jan-2014 18:01:37</br> 
4534,kdafh, 20-Feb-2014 07:17:19</br>
364,asjhdk, 11-Jul-2012 23:20:30</br>

내 대답은 다음과 같습니다.

cat input-file.txt | sed 's[</br>[[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

레코드가 한 줄에 있는 경우(입력 파일에서 </br> 뒤에 개행 없음)

cat input-file.txt | sed 's[</br>[\n[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

답변4

파일의 각 줄에 대해 쉘과 다른 명령을 실행하기 위해 새 프로세스를 생성하고 싶지 않을 것입니다. 이는 매우 비효율적입니다. 코드의 입력 기반 셸 해석을 사용하는 것도 명령 주입 취약점을 유발하는 방법입니다. 또한 이 -d옵션은 표준이 아닙니다.

여기서는 Perl과 같은 시간 조작이 가능한 텍스트 처리 도구를 사용하겠습니다.

perl -MTime::Piece -pe '
  s{\d+-\w+-\d+$}{Time::Piece->strptime($&, "%d-%b-%Y")->ymd}e
  ' < your-file

<digits>-<word-characters>-<digits>거기 에서 줄 끝의 find()를 일치시키고 $, 해석 하고, Perl의 핵심 Time::Piece 모듈을 사용 <day>-<month-abbrev>-<year>하도록 다시 포맷합니다 .<yead>-<month>-<day>

관련 정보