วิธีการจัดเรียงไฟล์ตามค่าตัวเลขสำหรับฟิลด์


114

ตัวอย่างfile.txt:

  100 foo
  2 bar
  300 tuu

เมื่อใช้sort -k 1,1 file.txtลำดับของบรรทัดจะไม่เปลี่ยนแปลงแม้ว่าเราจะคาดหวังว่า:

  2 bar
  100 foo
  300 tuu

วิธีการจัดเรียงฟิลด์ที่ประกอบด้วยตัวเลขตามค่าตัวเลขสัมบูรณ์?

คำตอบ:


149

ลองดูที่หน้าคนเพื่อจัดเรียง ...

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

นี่คือตัวอย่าง ...

sort -n filename

1
ขอบคุณทุกคน! นี่เป็นแบบใช้สายเนื่องจากฉันดูหน้าคนไปมาหลายครั้งและฉันไม่เห็นตัวเลือกนั้น อาฉันอยู่ที่หน้าคนธรรมดา ประณาม!
lukmac

1
โปรดทราบว่าสำหรับคะแนนลอยการใช้-g, --general-numeric-sortอาจแนะนำให้ใช้มากกว่านี้ สิ่งนี้ช่วยให้สัญกรณ์ทางวิทยาศาสตร์เช่น 1.234E10 เป็นต้น
Herpes Free Engineer

104

หากคุณกำลังจัดเรียงสตริงที่มีข้อความและตัวเลขผสมกันตัวอย่างเช่นชื่อไฟล์ของบันทึกการรีดการเรียงลำดับด้วย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

อย่างไรก็ตามฉันไม่แน่ใจว่ามันใช้ได้กับจำนวนลบ นี่คือผลลัพธ์ที่ฉันได้รับจากการเรียงลำดับเวอร์ชัน 6.10 บน Fedora 9

ไฟล์อินพุต:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

เอาท์พุท:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

ซึ่งเห็นได้ชัดว่าไม่ได้เรียงลำดับตามค่าตัวเลข

จากนั้นฉันเดาว่าคำตอบที่แม่นยำกว่านั้นน่าจะใช้ได้sort -nแต่ถ้าค่าทั้งหมดเป็นบวกเท่านั้น

PS: การใช้sort -gผลลัพธ์เดียวกันสำหรับตัวอย่างนี้

แก้ไข:

ดูเหมือนว่าการตั้งค่าภาษาจะส่งผลต่อการที่เครื่องหมายลบมีผลต่อคำสั่งซื้ออย่างไร ( ดูที่นี่ ) เพื่อให้ได้ผลลัพธ์ที่เหมาะสมฉันเพิ่งทำ:

LC_ALL=C sort -n filename.txt





-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.