awk를 사용하여 CSV의 열을 전환하시겠습니까? [복사]

awk를 사용하여 CSV의 열을 전환하시겠습니까? [복사]

나는 이것과 똑같은 문제가 있습니다여기. 유일한 차이점은 3개의 열만 있고 첫 번째 열을 끝으로 이동하려고 한다는 것입니다.

원본 파일은 다음과 같습니다.

col1,col2,col3
2,2015-01-04,23
196,2015-01-20,36

나는 다른 질문자들이 했던 실수를 하지 않았습니다(예: F 또는 OFS= 뒤에 쉼표를 추가하지 않음). 그래서 내 코드는

awk -F, '{print $2,$3,$1}' OFS=, old.csv > new.csv

하지만 새 행에 세 번째 열(첫 번째 열)이 표시됩니다.

col1,col2,col3
2015-01-04,23
,2
2015-01-20,36
,196

awk가 데이터의 세 번째 열을 새 행으로 보내는 이유는 무엇입니까? 저는 Windows의 Linux Bash Shell(Ubuntu)에서 awk를 사용하고 있습니다.여기.

답변1

입력 파일에는 DOS 스타일 줄 바꿈( \r\n)과 같은 일부 추가 데이터가 포함되어 있는 것처럼 보이지만 Unix 시스템에서는 파일에 일반적으로 \n.

예를 들어:

$ cat old.csv
col1,col2,col3
2,2015-01-04,23
196,2015-01-20,36

hexdump다음을 사용하여 파일의 실제 ASCII를 볼 수 있습니다 .

$ hexdump -C old.csv
00000000  63 6f 6c 31 2c 63 6f 6c  32 2c 63 6f 6c 33 0a 32  |col1,col2,col3.2|
00000010  2c 32 30 31 35 2d 30 31  2d 30 34 2c 32 33 0a 31  |,2015-01-04,23.1|
00000020  39 36 2c 32 30 31 35 2d  30 31 2d 32 30 2c 33 36  |96,2015-01-20,36|
00000030  0a                                                |.|
00000031

16진수 출력 에서는 0a개행 문자( \n)입니다. 기본적으로 이 파일을 사용하면 awk예상대로 작동합니다.

$ awk -F, '{print $2,$3,$1}' OFS=, old.csv
col2,col3,col1
2015-01-04,23,2
2015-01-20,36,196

old.csvCLI 도구를 사용하여 이 파일을 일반적으로 Windows/DOS 시스템을 구성하는 파일로 변환하면 수정 unix2dos된 파일은 old_dos.csv다음과 같습니다.

$ hexdump -C old_dos.csv
00000000  63 6f 6c 31 2c 63 6f 6c  32 2c 63 6f 6c 33 0d 0a  |col1,col2,col3..|
00000010  32 2c 32 30 31 35 2d 30  31 2d 30 34 2c 32 33 0d  |2,2015-01-04,23.|
00000020  0a 31 39 36 2c 32 30 31  35 2d 30 31 2d 32 30 2c  |.196,2015-01-20,|
00000030  33 36 0d 0a                                       |36..|
00000034

이제 우리는 0d이상하게 동작하는 이 파일에 사용 0a\r\n.awk

$ awk -F, '{print $2,$3,$1}' OFS=, old_dos.csv
,col1col3
,215-01-04,23
,196-01-20,36

관련 정보