จัดเรียงตามหน่วยเวลา (เช่น ms, s, ฯลฯ ) ใน Bash หรือ Shell


4

อะไรจะเป็นวิธีที่ง่ายที่สุดในการเรียงลำดับรายการหมายเลขต่อท้ายด้วยหน่วยเวลาใน bash หรือ shell? กล่าวอีกนัยหนึ่งฉันกำลังมองหาสิ่งที่คล้ายกับ "sort -h" แต่แทนที่จะเรียงหน่วยขนาดฉันต้องการเรียงลำดับหน่วยเวลา (ns, เรา, ms, s)

นี่คือรายการตัวอย่างที่ฉันต้องการเรียงลำดับ:
1.234s
804.2754ms
603.223us
50.1234ms


คำถามที่ดี. สำหรับฉันดูเหมือนว่า 2 ข้อบกพร่องใน sort -hหรืออาจเป็น 1 ข้อบกพร่องและข้อ จำกัด การออกแบบที่ไม่สามารถแก้ไขได้ 1 รายการ 1) us หรือ µs จัดการไม่ถูกต้อง (ข้อผิดพลาด) 2) s ไม่ได้รับการจัดการอย่างเหมาะสม (ข้อ จำกัด ในการออกแบบที่เป็นไปได้) ถ้าคุณแปลง s ไปยังหน่วยอื่นที่ทำงานอย่างถูกต้อง ( m, k, M ) sort -h ทำให้ถูกต้อง ลองด้วย mg/kg/Mg ค่า!)
quixotic

คำตอบ:


3

นี่คือวิธีหนึ่งในการแก้ปัญหานี้:

  1. เพิ่มคอลัมน์ที่สองโดยแปลงเวลาเป็นหน่วยเดียวกัน
  2. เรียงลำดับอินพุตในคอลัมน์ที่สอง
  3. วางคอลัมน์ที่สอง

คุณสามารถทำขั้นตอนที่ 1 ด้วยสคริปต์ awk สคริปต์นี้จะแปลงหน่วยเวลาเป็นนาโนวินาที:

{
    time = $1;
    sub(/[a-z]+$/, "", time);
    unit = $1;
    sub(/^[^a-z]+/, "", unit);

    # convert to nanoseconds
    if (unit == "us") {
        time *= 1000;
    } else if (unit == "ms") {
        time *= 1000000;
    } else if (unit == "s") {
        time *= 1000000000;
    }
    print $1, time
}

หากคุณบันทึกไว้ในไฟล์ convert.awkจากนั้นคุณสามารถทำตามขั้นตอนที่ 1-3 ด้วยขั้นตอนนี้:

awk -f convert.awk input.txt | sort -g -k2 | cut -f1 -d' '

-g แทน -n มีความจำเป็นในกรณีที่ตัวเลขบางตัวแสดงในรูปแบบเลขชี้กำลัง (ให้เครดิตกับ OP เพื่อชี้ว่า)


ทำงานได้ดีทีเดียว สิ่งเล็ก ๆ น้อย ๆ : ฉันสังเกตว่าบางครั้งผลลัพธ์จะถูกพิมพ์ในรูปแบบเลขชี้กำลังดังนั้นต้องเปลี่ยนไปใช้ sort -k2 -g
TLin

@TLin ดีขอบคุณที่ชี้ให้เห็นเพิ่มเข้าไปในคำตอบของฉัน
janos

1
-n และ -g ตัวเลือกของ sort เข้ากันไม่ได้ปล่อยให้เท่านั้น -g
Alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.