CSV에서 열을 내부 변환

CSV에서 열을 내부 변환

CSV의 날짜 변환에 도움이 필요합니다. 기본적으로 컬럼을 변환해서 새 파일로 저장할 수는 있지만 원본 CSV로는 저장할 수 없습니다.

내 CSV의 첫 번째 열인 DD/MM/YYYY HH:MM로 변환하려는 날짜 형식의 CSV가 있습니다 .YYYY-MM-DD HH:MM

내 CSV 파일에는 다음과 같은 내용이 있습니다.

29/01/2018 14:07,payable,37159871,,30521316
29/01/2018 14:07,payable,37159872,,30521316
29/01/2018 14:07,payable,37159870,,30521316
29/01/2018 14:07,payable,37159869,,30521316
29/01/2018 14:07,payable,37159868,,30521316

나는 다음과 같은 것을 원합니다 :

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

내가 할 수있는 것:

gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' /path/to/file.csv > test_file

이제 CSV 파일에 다시 저장하는 방법을 알고 싶습니다.

답변1

이 예제의 편집은 매우 간단하므로 Awk를 사용할 필요가 없습니다.

GNU Sed를 사용하는 것은 다음과 같이 간단합니다:

sed -rie 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv

BSD Sed의 경우 다음을 사용하십시오.

sed -Ei '' -e 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv

POSIX 도구만 사용하면 약간 보기 흉하지만 나쁘지는 않습니다.

printf '%s\n' '%s/^\(..\)\/\(..\)\/\(....\)/\3-\2-\1/' x | ex file.csv

편집: 실제로 자세히 살펴보세요POSIX 사양exSed와 마찬가지로 (거의) 모든 구분 기호를 사용할 수 있음을 나타냅니다. 그래서:

printf '%s\n' '%s_^\(..\)/\(..\)/\(....\)_\3-\2-\1_' x | ex file.csv

약간더 나은 것.

답변2

awk에는 "제자리에서 편집" 옵션이 내장되어 있지 않으며(보통 뒤에서 복사본으로 구현됨) 읽기 이후이 답변, 이 경우 내가 선호하는 솔루션은 다음과 같습니다.

cp 입력 파일 임시 파일&& 명령... 임시 파일> 입력 파일&& rm 임시 파일

귀하의 상황에 맞게:

cp /path/to/file.csv temp_file &&
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' < temp_file > /path/to/file.csv &&
rm temp_file

&&명령을 함께 바인딩하고 이전 명령이 성공한 경우에만 후속 명령을 실행하는 구문을 참고하세요 .

답변3

GNU awk를 사용하고 있으므로:

gawk -i inplace -F, ...

원본 파일을 백업하고 싶다면

gawk -i inplace -v INPLACE_SUFFIX=".bak" -F, ...

https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html#Extension-Sample-Inplace

답변4

다음 awk 명령을 사용하여 동일한 효과를 얻었습니다.

입력.csv

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

주문하다

awk '{gsub("/","-",$0);print $0}' input.csv| awk -F "-" '{print $3,$2,$1}'  | awk -F " " '{print $1"-"$(NF -1)"-"$NF,$2}'

산출

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

관련 정보