그래서 약 60개의 열이 포함된 큰 CSV 파일(70,000행)이 있습니다. 신기원 시간이 포함된 열을 해당 날짜로 변환해야 합니다.
작동하는 스크립트가 있습니다. 그런데 메인 CSV 파일에 사용하면 시간이... 오래 걸립니다. 실제로는 전혀 실행되지 않지만 초당 약 5행을 처리하고 있습니다.
i=1
for line in $(cat data.csv | cut -d, -f11);
do
if [[ $line =~ ^[0-9]{2,}$ ]];
then
day=$(date -r ${line} | cut -d' ' -f1 )
sed_comm="$i""s/$line/$day/"
sed -E -i.bak $sed_comm data.csv
fi
i=$(($i+1))
done
이는 파일의 작은 버전에서는 잘 작동하지만 기본 버전에서는 시간이 오래 걸립니다. 그래서 내 질문은 다음과 같습니다. 몇 시간 안 걸리게 할 수 있는 방법이 있나요?
속도를 높일 수 있는 방법을 찾아봤지만 지금까지 아무 것도 나오지 않았습니다.
저는 실제로 sed가 어떻게 작동하는지 알고 있기 때문에 지금 이 일을 하고 있습니다. 그러나 속도를 높이는 확실한 방법을 아는 사람이 있다면 감사하겠습니다.
작은 파일 버전:https://ufile.io/3qtcv0hz
참고: macOS에서 zsh를 사용하여 실행
답변1
GNU awk 사용( gawk
)파일이 필드에 따옴표로 묶인 쉼표가 없는 "간단한" CSV라고 가정합니다.
gawk -F, 'BEGIN{OFS=FS} {$11 = strftime("%c",$11)} 1' file.csv
열 11을 에포크 초에서 해당 지역에서 선호하는 날짜 및 시간 형식( %c
)으로 변환합니다.
Miller와 유사합니다(삽입된 쉼표를 포함하여 더 복잡한 CSV를 처리할 수 있음).
mlr --csv --implicit-csv-header put '$11 = strftime($11,"%c")' file.csv
사용 가능한 다른 날짜/시간 형식은 을 참조하세요 man strftime
.