"sort"명령을 사용하여 열 우선 순위별로 CSV 파일 정렬


94

csv 파일이 있는데 "order by"와 같은 열 우선 순위별로 정렬하고 싶습니다. 예를 들면 :

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1

이 상황이 "select"의 결과 인 경우 "order by"는 다음과 같습니다. order by column2, column1, column3-결과는 다음과 같습니다.

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1

Unix에서 "sort"명령을 사용하여 동일한 결과를 얻는 방법을 알고 싶습니다.


4
그건 그렇고, 그것은 ssv 파일입니다 (세미콜론으로 구분 된 값) : P
John Strood

답변:


157
sort --field-separator=';' --key=2,1,3

9
값이 숫자 인 경우 -n"문자열 숫자 값에 따라 비교"하는 -g옵션 또는 "일반 숫자 값에 따라 비교" 하는 옵션을 사용하는 것이 좋습니다. 숫자 값의 문자열 비교는 1,10,2,20. 적어도 이것들은 CentOS의 내 버전에서 사용할 수있는 옵션입니다. 해당 버전의 올바른 옵션이 무엇인지 man 페이지에서 확인해야합니다.
Adam Porad 2013-06-14

5
나는 얻는다sort: stray character in field spec: invalid field specification ‘2,1,3’
Martin Thoma

3
그러나 sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv나를 위해 일했습니다.
Martin Thoma

6
@MartinThoma 오랜 시간 이었지만 문제가 발생하여 발견했습니다 sort --field-separator=';' --key={2,1,3}. 이 작업은 GNU coreutils 8.42016 년 4 월
mrbolichi

3
@mrbolichi 표기법 --key={2,1,3}은 bash의 중괄호 확장을 사용합니다
kvantour

28

다른 행이 가정 3;10;3당신의 unsorted.csv파일. 그런 다음 숫자로 정렬 된 결과를 기대합니다.

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3

알파벳순으로 정렬 된 것이 아닙니다.

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1

이를 얻으려면 다음을 사용해야합니다 -n.

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv

2,2사용해야 하는 것을 언급 할 가치가 있습니다. only 2가 사용되는 경우 sort필드 2의 시작부터 끝까지 문자열 을 가져옵니다. 2,2필드 만 사용되는지 확인합니다 2.


7
-k 2와 -k 2,2의 차이에 대한 포인터가 중요합니다! 나는 맨 페이지를 처음 읽었을 때 이것을 간과했습니다. 감사.
usonianhorizon

나는 몇 가지 추가 행이 추가 3;10;3, 3:10:5, 3:10;2, 3;10;3소스 파일의 순서로, 그리고 사용하는 경우 단지 -k 2,2 는 2 열 및 매뉴얼 페이지 말한다 3. 정렬이 나타납니다 "The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal.". 제 경우에는 이전 키 (값 = 10)가 동일하게 비교되었지만 -k여러 번 지정하지 않았습니다 . 이것이 신뢰할 수있는 동작인지 또는 내 시스템 (mac)과 관련된 것인지 잘 모르겠습니다. 궁극적으로 기본 정렬이 올바른 한 중요하지 않습니다.
Davos

-s, 같은 키를 무시하는 안정적인 정렬이 있다는 것을 알았습니다. 이는 사람에 따르면 분명히 더 빠릅니다.
Davos

24

위의 Charlie의 대답은 Cygwin (정렬 버전 2.0, GNU textutils)에서 저에게 효과적이지 않았습니다.

sort -t"," -k2 -k1 -k1

3
Cygwin에는 이전 버전이 있습니다. 언제나 그렇듯이 man 페이지는 당신의 친구입니다.
Charlie Martin

2
@CharlieMartin에 동의합니다. 시스템의 맨 페이지를 확인해야합니다. CentOS에서 사용sort --field-separator=';' -k2 -k1 -k3 test.csv
Adam Porad

-6

.. 누군가 '정렬'솔루션을 따랐지만 이제 한 줄에 하나의 고유 항목 (즉, 고유 항목의 상위 X 개) 이상을 얻고 자하는 경우 '정렬'을 사용하여 파일을 정렬하면 다음을 사용할 수 있습니다. 여기에서 만든 작은 앱 :

https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java


2
잘 됐네요! 그러나 귀하의 경우, 당신은 단지 사용을 가질 수있다 cat unsorted-file | sort | uniq | head -X- 때 X첫 번째 행의 수는 당신이 출력 바랍니다.
Slavik Meltser

@SlavikMe 의견 주셔서 감사합니다! 그러나 귀하의 제안은 다른 결과를 제공합니다. 귀하의 제안은 완전히 정렬 된 파일에서 처음 X 줄을 가져 오는 반면, 우리는 "키"당 처음 X 줄을 가져오고 싶었습니다 (예 : 이름이있는 CSV가있는 경우 정렬하면 열 2 "성"에 의해 명령은 아마도 "Allen"이 성이있는 3 줄만 얻을 수있는 반면 우리는 "Allen", "Brittain", "Charles"등을 얻습니다). 그래도 고마워!
Daniel Iversen

6
당신은 잘못. 나는 주석을 달기 전에 내가 쓴 명령을 시도해 볼 것을 제안했을 것입니다. 맨 위 행을 추출하기 직전에 정렬 된 모든 행에 고유성을 부여하는 및 uniq사이에 파이프 순서로 된 명령 이 있습니다. sorthead
Slavik Meltser 2016-06-05
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.