CSV 파일은 정렬되지만 헤더는 정렬되지 않습니다.

CSV 파일은 정렬되지만 헤더는 정렬되지 않습니다.

CSV 파일을 정렬해야 하는데 헤더 행(첫 번째 행)이 계속 정렬됩니다. 이것이 내가 사용하는 것입니다:

cat data1.csv | sort -t"|" -k 1 -o data1.csv 

다음은 예시 라인입니다:

Name|Email|Country|Company|Phone 
Brent Trujillo|[email protected]|Burkina Faso|Donec LLC|(612) 943-0167

답변1

이것은 작동하고 다음으로 출력됩니다 data2.csv.

head -n 1 data1.csv > data2.csv &&
tail -n +2 data1.csv | sort -t "|" -k 1 >> data2.csv

답변2

제 생각에는 문제의 큰 부분이

... -k 1 ...

sort그들의 -k주장은적어도-k [num] 시작 그리고 ,[num] 각각에는 고유한 참조가 있습니다. 실제로 -k 1이것은 정렬 키를 전혀 지정하지 않는 것과 다르지 않습니다. 왜냐하면 닫는 참조가 없으면 줄 sort은 줄의 처음부터 끝까지 정렬되기 때문입니다.

sort첫 번째 구분된 필드만 |래핑 하려면 다음을 수행해야 합니다.

... -k1,1 ...

이렇게 하고 첫 번째 줄에시작그런 다음 |GNU를 사용하면 sort다음을 수행할 수 있습니다...

sort -st\| -k1,1 <infile >outfile

...첫 번째 줄은 그대로 유지됩니다. 원하는 동작을 얻을 수 있습니다.

POSIX가 한 줄의 모든 바이트 계산을 sort지정하기 때문에 위에서 GNU를 지정했습니다.sort비교를 위해 중요한-u고유 하지 않은 작업 sort에서 모든 정렬 키를 사용한 후(두 번 - 첫 번째 패스 후 최소한 삭제 수정자가 할당된 인접한 동일 키 행)그리고 인접한 동일한 결합 라인을 유지하십시오. 이는 다음을 의미합니다...

printf '|%s\n' 9 1 | sort -nk1,1

...POSIX sort인쇄 중...

|1
|9

-k...첫 번째 필드( 모든 인수 와 일치하는 유일한 필드)가 완전히 비어 있기 때문에 직관에 반할 수 있습니다 . 기본적으로 GNU sort도 동일한 내용을 인쇄하지만 -s테이블 정렬 옵션이 지정되면 인쇄됩니다...

|9
|1

... 테이블 정렬을 위해 중복 항목을 -u제거하지는 않지만 고유 정렬과 동일한 방식으로 명령줄에 지정된 필드에서 허용되는 것 이상의 행을 평가하지 않기 때문입니다 .-s

파일을 전혀 변경하지 않고 헤더 행이 첫 번째 행이고 정렬에 GNU를 사용하는 경우 sort다음을 수행할 수 있습니다.

{ printf \|; cat file; } | 
sort -st\| -k1,1 | 
sed 's/.//;q'

...제 생각엔 표준 출력에서 ​​원하는 결과를 얻을 수 있을 것 같습니다.

아니면 그런 것...

{ printf \|; cat file; } | 
nl -ba -s\| |
sort -t\| -k2,2 -k1n,1 |
cut -d\| -f2-

...어떤 구현에서도 마찬가지입니다.

관련 정보