"head"는 한 줄만 인쇄합니까?

"head"는 한 줄만 인쇄합니까?

Excel에서 CSV로 저장하여 생성된 CSV 파일이 있습니다. "head"(또는 실제로는 "grep" 등)를 수행하면 첫 번째 줄만 인쇄됩니다.

head -n 10 messy.csv
10,15,11,21

하지만 텍스트 편집기나 Excel에서 파일을 열면 다음과 같은 줄이 많이 포함되어 있습니다.

10,15,11,21
9,11,17,19
7,11,24,18
... 

head컴퓨터의 다른 파일에서는 잘 작동합니다.

왜 이런거야? (이것은 줄 끝과 관련이 있는 것으로 생각되지만 무엇인지 모르겠습니다.) 어떻게 수정합니까?

답변1

나는 이것이 줄 끝과 관련이 있다고 생각합니다. Excel에서는 캐리지 리턴/줄 바꿈 끝으로 파일을 저장하지만 head줄 바꿈만 필요합니다.

표시되는 출력은 다음과 같습니다. tr -d '\r' < messy.csv | head -10

10줄이 올바르게 표시되면 그것이 정답입니다.

file일부 텍스트 파일의 줄 끝을 알려줄 수 있습니다(인쇄됩니다)...., CRLF 줄 종결자 포함), 그러나 모든 텍스트 파일에 대해 이 작업을 수행하지는 않습니다(해당 파일을 HTML과 같은 다른 것으로 인식하는 경우에는 이 작업을 수행하지 않을 것이라고 생각합니다).

답변2

당신은\r 오직2번째 줄부터 줄 끝 문자로 사용됩니다(적어도 10번째 줄까지). 라인 1 \n에는 라인 종결자가 있습니다. 예를 들어.

printf 'ABC\nXYZ\r123\r' | head

출력(화면으로)

ABC

이것은전시하다터미널 출력과 관련된 아티팩트. 줄의 시작 부분으로 다시 이동 \r하면 다음 줄이 이를 덮어쓰고 마지막 줄은 터미널 프롬프트에 의해 전체 또는 부분적으로 덮어쓰여집니다.

마지막 \r으로 구분된 줄이 프롬프트보다 길면 해당 줄은 다음과 같습니다.부분적으로표시(프롬프트 끝 이후) - 예를 들어 아래 샘플 출력에서 ​​터미널 프롬프트는 단지 nn $(5자) nn입니다. 여기서 n번째 명령이 실행됩니다.

72 $ printf 'ABC\nXYZ\rabcdefghijklmnop\r' 
ABC
73 $ fghijklmnop

이 문제를 해결하기 위해

sed -i.bak 's/\r$//; s/\r/\n/g' file

-i.bak옵션을 사용하면 입력이 file업데이트됩니다.nline으로 백업을 만드세요 file.bak. 백업을 원하지 않는다면 그냥 사용하세요 -i.

답변3

문제를 분석하세요

head동작이 예상한 것과 다릅니다. 간단한 분석 도구로 전환하여 od무슨 일이 일어나고 있는지 확인하세요.

od -cx messy.csv

그런 다음 head이 파일로 무엇을 해야 할지 알아보세요.

head -2 messy.csv | od -cx

다음을 위해 설계되었기 때문에 반환 ASCII 코드( )를 head처리한다는 것을 알 수 있습니다 .\r0x0d

기본 유형 작성기의 "캐리지 리턴" 문자를 만듭니다. 현재 커서 위치를 다시 가져오고 "줄 시작"에 다음 위치를 쓸 준비가 되었습니다.

고치다

여기에서 올바른 sed명령을 확인하세요. Excel 파일의 "\r" 수정

기록을 위해

이 Microsoft 버그는 승자입니다. Windows, Unix(모두), MacOS X 등의 운영 체제에서는 Excel 줄 끝 인코딩이 잘못되었습니다.

당신은 그것을 이길 수 없습니다 :).

답변4

올바른 접근 방식은 다음과 같습니다.

head -10 file.txt(처음 10줄을 인쇄하세요)

또 다른 방법은 다음과 같습니다.

cat file.txt | head -10

관련 정보