ตัวอย่างfile.txt
:
100 foo
2 bar
300 tuu
เมื่อใช้sort -k 1,1 file.txt
ลำดับของบรรทัดจะไม่เปลี่ยนแปลงแม้ว่าเราจะคาดหวังว่า:
2 bar
100 foo
300 tuu
วิธีการจัดเรียงฟิลด์ที่ประกอบด้วยตัวเลขตามค่าตัวเลขสัมบูรณ์?
ตัวอย่างfile.txt
:
100 foo
2 bar
300 tuu
เมื่อใช้sort -k 1,1 file.txt
ลำดับของบรรทัดจะไม่เปลี่ยนแปลงแม้ว่าเราจะคาดหวังว่า:
2 bar
100 foo
300 tuu
วิธีการจัดเรียงฟิลด์ที่ประกอบด้วยตัวเลขตามค่าตัวเลขสัมบูรณ์?
คำตอบ:
ลองดูที่หน้าคนเพื่อจัดเรียง ...
-n, --numeric-sort compare according to string numerical value
นี่คือตัวอย่าง ...
sort -n filename
-g, --general-numeric-sort
อาจแนะนำให้ใช้มากกว่านี้ สิ่งนี้ช่วยให้สัญกรณ์ทางวิทยาศาสตร์เช่น 1.234E10 เป็นต้น
หากคุณกำลังจัดเรียงสตริงที่มีข้อความและตัวเลขผสมกันตัวอย่างเช่นชื่อไฟล์ของบันทึกการรีดการเรียงลำดับด้วย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
ls
ผ่านsed
เพื่อลบตัวอักษรและเหลือเพียงตัวเลข แต่เห็นได้ชัดว่าเอาต์พุตสีก็ส่งผลต่อสิ่งต่าง ๆ เช่นกัน ดังนั้นการวิ่งls --color=never
ยังสร้างความแตกต่าง
-V
คือสิ่งที่ฉันกำลังมองหา ฉันควรสร้างนิสัยในการดูหน้าคนก่อน
คำตอบอื่น ๆ ส่วนใหญ่ที่นี่อ้างถึง
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
คุณต้องใช้ตัวเลือกการเรียงลำดับตัวเลข:
sort -n -k 1,1 File.txt
ใช้sort -n
หรือsort --numeric-sort
.
คุณต้องทำตามคำสั่งต่อไปนี้:
sort -n -k1 filename
ที่ควรทำ :)
ใช้ sort -nr สำหรับการเรียงลำดับจากมากไปหาน้อย อ้างถึง
ดูหน้า Man ด้านบนสำหรับการอ้างอิงเพิ่มเติม
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