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-
...어떤 구현에서도 마찬가지입니다.