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

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

입력 파일: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다음 결과 Unix 타임스탬프 strftime()와 형식 문자열을 사용하여 다시 형식화하여 다시 작성됩니다(예: 대신 %F사용할 수 있음 ).%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>줄 끝( $)에 있는 항목을 일치시키고 이를 Perl의 핵심 Time::Piece 모듈을 사용하는 것으로 해석 <day>-<month-abbrev>-<year>하고 다시 포맷합니다 .<yead>-<month>-<day>

관련 정보