필드의 숫자 값을 기준으로 파일을 정렬하는 방법은 무엇입니까?


114

file.txt:

  100 foo
  2 bar
  300 tuu

를 사용하면 sort -k 1,1 file.txt다음과 같이 예상되지만 행 순서는 변경되지 않습니다.

  2 bar
  100 foo
  300 tuu

절대 숫자 값을 기준으로 숫자로 구성된 필드를 정렬하는 방법은 무엇입니까?

답변:


149

정렬을 위해 man 페이지를 들여다보십시오 ...

   -n, --numeric-sort
          compare according to string numerical value

여기에 예가 있습니다 ...

sort -n filename

1
여러분 모두 감사합니다! 맨 페이지를 여러 번 앞뒤로 살펴 보았지만 해당 옵션이 보이지 않았기 때문에 이것은 유선입니다. 아, 나는 단순화 된 맨 페이지에 있었다. 제길!
lukmac

1
부동 소수점의 경우 사용 -g, --general-numeric-sort하는 것이 더 바람직 할 수 있습니다. 이것은 더 과학적 표기법 예를 들어 1.234E10 등을 할 수 있습니다
포진 무료 엔지니어

103

예를 들어 롤링 로그의 파일 이름과 같이 텍스트와 숫자가 혼합 된 문자열을 정렬하는 경우 정렬이 sort -n예상대로 작동하지 않습니다.

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

이 경우 옵션 -V이 트릭을 수행합니다.

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

맨 페이지에서 :

   -V, --version-sort
          natural sort of (version) numbers within text

1
이로 인해 넘어 졌으니 감사합니다! 적어도 내 cygwin에서 나를 엉망으로 만든 또 다른 점 은 문자를 제거하고 숫자 만 남기기 위해 ls스루 sed대체를 파이핑 할 때도 색상 출력이 사물에 영향을 미친다는 것입니다. 그래서 달리기 ls --color=never도 차이를 만들었습니다.
Max Starkenburg

굉장합니다, -V정확히 제가 찾던 것입니다. 맨 페이지를 먼저 살펴 보는 습관을 들이자.
srowley

18

여기에있는 대부분의 다른 답변은

sort -n

그러나 이것이 음수에 대해 작동하는지 확실하지 않습니다. 다음은 Fedora 9에서 정렬 버전 6.10으로 얻은 결과입니다.

입력 파일:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

산출:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

분명히 숫자 값으로 정렬되지 않았습니다.

그렇다면 더 정확한 대답은 sort -n모든 값이 양수인 경우에만 사용하는 것이라고 생각합니다 .

추신 :을 사용하면 sort -g이 예에서 동일한 결과가 반환됩니다 .

편집하다:

로케일 설정이 빼기 기호가 순서에 영향을 미치는 방식에 영향을 미치는 것 같습니다 ( 여기 참조 ). 적절한 결과를 얻기 위해 방금했습니다.

LC_ALL=C sort -n filename.txt



1

다음 명령을 수행해야합니다.

sort -n -k1 filename

그것은 그것을해야합니다 :)


-1

내림차순으로 정렬하려면 sort -nr을 사용하십시오. 보내다

종류

자세한 내용은 위의 Man 페이지를 참조하십시오.


-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

1
이 코드가 무엇을하는지에 대한 약간의 텍스트 설명을 추가 하시겠습니까?
Stedy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.