입력 파일: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>