macOS에서 awk/gawk를 사용하여 날짜 형식 변환

macOS에서 awk/gawk를 사용하여 날짜 형식 변환

수백만 행의 데이터가 있는데 상사가 데이터를 다시 포맷하라고 요청했습니다.

형식은 다음과 같습니다.

06/28/2022,04:00,142.01,142.38,141.59,142.15,3151
06/28/2022,04:01,142.1,142.1,142.1,142.1,196

첫 번째 날짜 필드의 형식을 다음과 같이 변경해야 합니다.

20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

%Y%m%d

나는 다음을 가지고 있습니다 :

gawk -F"," '{OFS=","; $1=strftime("%Y%m%d", $1); print $0}' AAPL.txt > AAPL.csv

그런데 이상한 점은 작동하는데 생성된 날짜가 1969년이라는 겁니다.

19691231,04:00,142.01,142.38,141.59,142.15,3151
19691231,04:01,142.1,142.1,142.1,142.1,196

이유를 모르겠습니다. MacOS에서는 사용할 수 없고 외부 호출 로 인해 성능이 크게 저하될 수 있기 gawk때문에 이것을 선택했습니다 .awkstrftimedate

답변1

awk strftime()GNU는 Unix 타임스탬프를 두 번째 인수로 기대하기 때문에 코드가 예상한 대로 작동하지 않습니다 . 임의의 날짜/시간 문자열을 구문 분석할 수 없습니다.

그러나 strftime()여기서는 실제로 이것이 필요하지 않습니다.

$ awk -F , 'BEGIN { OFS=FS } { split($1,a,"/"); $1 = a[3] a[1] a[2] }; 1' file
20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

이는 입력의 각 줄을 간단한 쉼표로 구분된 필드로 처리하고 첫 번째 필드를 /배열로 분할합니다 a. 그런 다음 첫 번째 필드는 원하는 순서로 연결된 배열 요소로 모양이 변경됩니다.

1코드 끝에 있는 아일랜드는 awk수정된 레코드가 출력되도록 합니다.

이는 awkmacOS의 기본 설정으로 작동합니다. 입력 날짜를 문자열로 처리하고 간단히 재구성하므로 특별한 날짜 형식 지정 기능이 필요하지 않습니다. 날짜에 대한 유일한 가정은 DD/MM/YYYY입력에서도 항상 형식이고 YYYYMMDD출력에서도 형식이어야 한다는 것입니다.

답변2

strftime필드만 교체하면 되므로 날짜 처리와 같은 기능은 필요하지 않습니다 . sed여기에서는 잘 작동합니다.

sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample

관련 정보