나는 이것과 똑같은 문제가 있습니다여기. 유일한 차이점은 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.csv
CLI 도구를 사용하여 이 파일을 일반적으로 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