수백만 행의 데이터가 있는데 상사가 데이터를 다시 포맷하라고 요청했습니다.
형식은 다음과 같습니다.
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
때문에 이것을 선택했습니다 .awk
strftime
date
답변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
수정된 레코드가 출력되도록 합니다.
이는 awk
macOS의 기본 설정으로 작동합니다. 입력 날짜를 문자열로 처리하고 간단히 재구성하므로 특별한 날짜 형식 지정 기능이 필요하지 않습니다. 날짜에 대한 유일한 가정은 DD/MM/YYYY
입력에서도 항상 형식이고 YYYYMMDD
출력에서도 형식이어야 한다는 것입니다.
답변2
strftime
필드만 교체하면 되므로 날짜 처리와 같은 기능은 필요하지 않습니다 . sed
여기에서는 잘 작동합니다.
sed 's@\([^/]*\)/\([^/]*\)/\([^,]*\)@\3\1\2@' sample