Làm thế nào để sắp xếp một tệp, dựa trên các giá trị số của nó cho một trường?


114

Ví dụ file.txt:

  100 foo
  2 bar
  300 tuu

Khi sử dụng sort -k 1,1 file.txt, thứ tự các dòng sẽ không thay đổi, mặc dù chúng tôi đang mong đợi:

  2 bar
  100 foo
  300 tuu

Làm thế nào để sắp xếp một trường bao gồm các số dựa trên giá trị số tuyệt đối?

Câu trả lời:


149

Hãy xem qua trang người đàn ông để biết ...

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

Vì vậy, đây là một ví dụ ...

sort -n filename

1
Cảm ơn tất cả các bạn! Điều này có dây, bởi vì tôi đã xem đi xem lại trang người đàn ông của nó nhiều lần và tôi không thấy tùy chọn đó. À, tôi đang ở một trang đơn giản. Chỉ trích!
lukmac

1
Xin lưu ý rằng, đối với các dấu chấm động, việc sử dụng -g, --general-numeric-sortcó thể được khuyến khích hơn. Điều này tiếp tục cho phép ký hiệu khoa học ví dụ 1.234E10, vv
Herpes miễn phí Engineer

103

Nếu bạn đang sắp xếp các chuỗi là văn bản và số hỗn hợp, chẳng hạn như tên tệp của nhật ký cuộn thì sắp xếp với sort -nkhông hoạt động như mong đợi:

$ 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

Trong trường hợp đó, tùy chọn -Vthực hiện mẹo:

$ 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

từ trang người đàn ông:

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

1
Điều này đã làm tôi vấp ngã, vì vậy cảm ơn bạn! Một thứ khác mà sai lầm tôi, ít nhất là trên Cygwin của tôi, là ngay cả khi đường ống lsthông qua sedthay thế để loại bỏ các chữ cái và để lại chỉ số, rõ ràng đầu ra màu đã ảnh hưởng đến mọi thứ là tốt. Vì vậy, chạy ls --color=nevercũng tạo ra sự khác biệt.
Max Starkenburg

Tuyệt vời, -Vchính xác là những gì tôi đang tìm kiếm. Tôi nên tạo thói quen xem qua các trang nam trước.
srowley

18

Vâng, hầu hết các câu trả lời khác ở đây đề cập đến

sort -n

Tuy nhiên, tôi không chắc điều này có hiệu quả với các số âm. Đây là kết quả tôi nhận được với phiên bản sắp xếp 6.10 trên Fedora 9.

Tệp đầu vào:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Đầu ra:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Mà rõ ràng là không được sắp xếp theo giá trị số.

Sau đó, tôi đoán rằng một câu trả lời chính xác hơn sẽ được sử dụng sort -nnhưng chỉ khi tất cả các giá trị đều dương.

Tái bút: Sử dụng sort -gchỉ trả về kết quả tương tự cho ví dụ này

Biên tập:

Có vẻ như cài đặt ngôn ngữ ảnh hưởng đến cách dấu trừ ảnh hưởng đến thứ tự ( xem tại đây ). Để có được kết quả phù hợp, tôi đã làm:

LC_ALL=C sort -n filename.txt

7

Bạn phải sử dụng tùy chọn sắp xếp số:

sort -n -k 1,1 File.txt


1

Bạn phải thực hiện lệnh sau:

sort -n -k1 filename

Nên làm vậy :)


-1

Sử dụng sort -nr để sắp xếp theo thứ tự giảm dần. Tham khảo

Sắp xếp

Tham khảo trang Man trên để tham khảo thêm


-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
Bạn muốn thêm một chút giải thích văn bản về những gì mã này làm?
Hài kịch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.