파일의 두 번째 열을 기준으로 데이터 정렬


212

두 개의 열과 n행 수의 파일 이 있습니다.

열 1은 names및 열 2를 포함 age합니다.

이 파일의 내용을 age(두 번째 열)을 기준으로 오름차순으로 정렬하고 싶습니다 .

결과는 name가장 어린 사람 name과 그 다음에 가장 어린 사람 등을 표시해야합니다.

하나의 라이너 쉘 또는 bash 스크립트에 대한 제안.


답변:


329

다음 sort명령을 사용할 수 있습니다 .

sort -k2 -n yourfile

-n, --numeric-sort가치있는 숫자 문자열에 따라 비교

예를 들면 다음과 같습니다.

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
또한 참고 사용하는 -h대신 -n종류의 사람이 읽을 수있는 같은 값 것이다 2G3K뿐만 아니라 숫자로 구분 쉼표 예1,234.5
chillitom

"잘못된"주문과 관련된 문제에 직면했습니다. "*** 경고 *** 환경에 의해 지정된 로케일은 정렬 순서에 영향을줍니다. LC_ALL=C기본 바이트 값을 사용하는 전통적인 정렬 순서를 갖도록 설정하십시오 ." (없이 문자열 일치 경우 -n)
x'ES

-k는 행 끝까지 읽으므로 첫 번째 열의 공백은 두 번째 이후에 더 많은 열이 있으면 작동하지 않는다고 간주하지 않습니다. 파일이 TSV 파일이라고 가정하면 더 나은 솔루션입니다sort -t$'\t' -k2 -n FILE
tuxErrante

-t 옵션을 사용하여 구분 기호를 지정해야 할 수도 있습니다.
스펙트럼

85

해결책:

sort -k 2 -n filename

보다 간결하게 다음과 같이 작성되었습니다.

sort --key 2 --numeric-sort filename


예:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

설명:

  • -k # -이 인수는 정렬에 사용될 첫 번째 열을 지정합니다. (여기서 열은 공백으로 구분 된 필드로 정의됩니다. 인수 -k5는 각 행의 다섯 번째 문자 가 아니라 각 행 의 다섯 번째 필드 부터 시작하여 정렬 됩니다)

  • -n- 이 옵션은 "숫자 정렬"을 지정하여 열이 텍스트 대신 숫자 행으로 해석되어야 함을 의미합니다.


더:

다른 일반적인 옵션은 다음과 같습니다.

  • -r- 이 옵션은 정렬 순서를 반대로 바꿉니다. --reverse 로 쓸 수도 있습니다 .
  • -i- 이 옵션은 인쇄 할 수없는 문자를 무시합니다. --ignore-nonprinting 으로 쓸 수도 있습니다 .
  • -b- 이 옵션은 선행 공백을 무시합니다. 공백은 행 수를 결정하는 데 사용되므로 편리합니다. --ignore-leading-blanks 로 쓸 수도 있습니다 .
  • -f- 이 옵션은 대소 문자를 무시합니다. "A"== "a". --ignore-case 로 쓸 수도 있습니다 .
  • -t [new separator] -이 옵션은 전처리에서 공백 이외의 연산자를 사용합니다. --field-separator 로 쓸 수도 있습니다 .

다른 옵션이 있지만 가장 자주 사용되는 유용한 옵션입니다.


@Angelo이 답변은이 질문에 대한 답변을 수락 한 후 몇 년 후에 게시 된 것으로 추정되지만 새로운 답변으로 간주하셨습니까?
Jonathan Y.

옵션 -t은 실제 생명의 은인이었습니다! 열에 공백이 있고 열이 주어진 문자 ,나 탭에 따라 달라지는 경우
AKS

12

탭으로 구분 된 값의 경우 아래 코드를 사용할 수 있습니다

sort -t$'\t' -k2 -n

-r은 내림차순으로 데이터를 가져 오는 데 사용할 수 있습니다.
숫자 정렬의 경우 -n
-k, --key = POS1 [, POS2] 여기서 k는 파일의 열입니다.
아래 내림차순은 코드입니다.

sort -t$'\t' -k2 -rn

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.