하나의 열로만 UNIX를 정렬하는 방법은 무엇입니까?


47

유닉스 정렬에 대한 -k 옵션을 사용하면 특정 열과 다음 열을 기준으로 정렬 할 수 있습니다. 예를 들어, 입력 파일이 주어진 경우 :

2 3
2 2
1 2
2 1
1 1

을 사용 sort -n -k 1하여 첫 번째 열과 두 번째 열별로 정렬 된 출력을 얻습니다.

1 1
1 2
2 1
2 2
2 3

그러나 다음과 같이 두 번째 열 순서를 유지하고 싶습니다.

1 2
1 1
2 3
2 2
2 1

sort명령으로 가능 합니까?

답변:


64

이것을 시도하십시오 :

sort -s -n -k 1,1

-s지정된 키의 일부가 아니 었 다에 정렬 정렬 비활성화 '마지막 수단'.

-k 1두 번째 열을 정렬하려고하면 당신이 볼 수 있듯이, 실제로 평균 "이 필드와 다음의 모든"숫자 정렬의 맥락에서 않습니다. 당신은 단지 나머지 줄로 가면서 관계가 깨지는 것을보고있을뿐입니다. 그러나 일반적 으로 필드 1 에서만-k 1,1 정렬 하도록 지정해야합니다 .


네 말이 맞아 이것이 바로 내가 필요한 것입니다. 감사!

이런 종류의 출력에 join을 사용할 수 있습니까?
MiNdFrEaK

@MiNdFrEaK : 요구 사항은 join입력 한 필드에서 입력을 정렬하는 것입니다. 따라서이 출력은 첫 번째 필드에서 정렬되며 결합 할 수 있습니다.
Cascabel

2 개의 파일이 있습니다. 하나는 2 열이고 다른 하나는 1 열입니다. 두 번째 파일은 sort -u를 사용하여 정렬됩니다. 이제 작업은이 열을 정렬되지 않은 첫 번째 파일의 첫 번째 열과 결합해야하므로 구문은 무엇입니까? 이게 효과가 있을까요? -j 1 file2.txt 정렬 -s -n -k 1 file1.txt?
MiNdFrEaK

1
-k 1,1합니다 (이 " 1 "부분은) 나를 위해 더 나은 작동하지 않습니다. 무엇 작동 것은 -s -k 1함께, -n당신이 그것을 필요로하는 경우에.
Totor

10

첫 번째 열에서만 정렬하려면 다음을 수행하십시오.

sort -n -s -k1,1

에서 유닉스와 리눅스 시스템 관리 핸드북

sort는 키 사양 -k3 (-k3,3이 아닌)을 허용하지만 예상 한대로 수행하지 않을 수 있습니다. 종료 필드 번호가 없으면 정렬 키는 줄 끝까지 계속됩니다.


나를 위해 일하지 않고 -sCascabel이 지적한대로 옵션 을 추가해야합니다 .
장 폴

@JeanPaul이 맞습니다. -s"이 옵션은 키가 같은 레코드의 원래 레코드 순서를 유지합니다."
tidbeck

2

제공된 답변 중 어느 것도 나를 위해 일반적으로 효과가 없습니다.

모두 sort -s -k 2 file1sort -n -k1,1이 파일에 추가 정렬을 수행합니다

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

방금이 정확한 작업을 수행하고 쉘 루프를 사용했습니다. 정렬 된 열의 각 고유 값에 대해 전체 파일을 읽어야하므로이 솔루션은 매우 큰 파일에서 제대로 작동하지 않을 수 있습니다.

여기에서 파일은 열 2에서만 정렬됩니다.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

Cascabel이 제안한 답변이 효과가 있지만 잘못 읽은 것 같습니다.
장 폴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.