แม้ว่าจะเกินความจำเป็นสำหรับตัวอย่างปัจจุบันเนื่องจาก วิธีแก้ปัญหาที่เสนอในคำตอบของ user68186โดยทั่วไปคุณสามารถทำสิ่งนี้ใน GNU awk:
จ้อง -F/ '
ฟังก์ชัน mycmp(i1,v1,i2,v2) {
m = แยก (v1,a);
n = แยก (v2,b);
กลับ a[m]"" > b[n]"" ? 1 : ก[ม]"" < ข[น]"" ? -1 : 0
}
{
เส้น[NR] = $0
}
จบ {
PROCINFO["sorted_in"] = "mycmp";
สำหรับ (i ในบรรทัด) เส้นพิมพ์[i]
}
' ไฟล์
โปรดทราบว่าจะเรียงตามค่าคำศัพท์ของทุกอย่างที่อยู่หลังค่าสุดท้าย /
- ดังนั้นหากเป็นรูปแบบ ผู้แต่ง-<ชื่อผู้แต่ง>-<ชื่อเรื่อง>.<นามสกุล>
นั่นจะเป็น
- สตริงคงที่
ผู้เขียน-
(ซึ่งไม่มีผลเนื่องจากมีน้ำหนักเท่ากันทุกเส้น); แล้ว
<ชื่อผู้เขียน>-
; แล้ว
<ชื่อเรื่อง>.
; แล้ว
<extension>
สิ่งนี้คล้ายกับวิธีที่ GNU เรียงลำดับ
ของ KEYDEF อย่างง่าย -t- -k2
ใช้งานได้เช่นคีย์การเรียงลำดับที่มีประสิทธิภาพเริ่มต้นจาก <author name>
และไปต่อที่ปลายสาย
ตัวคั่นที่ชัดเจนถูกตัดออกจาก แยก
โทรเพื่อให้พวกเขาสืบทอดค่าของ เอฟ.เอส
ทำให้ง่ายต่อการเปลี่ยนแปลงสำหรับระบบที่ใช้ตัวคั่นเส้นทางอื่น สตริงว่างที่ต่อท้าย ""
ใน มายซีเอ็มพี
ฟังก์ชันบังคับให้มีการเปรียบเทียบคำศัพท์แม้ว่าชื่อไฟล์จะเป็นตัวเลขก็ตาม ดูตัวอย่าง awk แปลงระหว่างสตริงและตัวเลขอย่างไร
หากคุณต้องการที่จะติดกับ เรียงลำดับ
คำสั่ง คุณสามารถใช้ประโยชน์จาก GNU awk ได้ การสื่อสารสองทางกับกระบวนการอื่น ถึง:
- ทำซ้ำครั้งสุดท้าย
/
- แยกฟิลด์ที่จุดเริ่มต้นของสตริง
- ส่งผลลัพธ์ไปยัง
เรียงลำดับ
คำสั่ง
- อ่านผลการเรียงลำดับ ลบคำนำหน้าซ้ำแล้วพิมพ์
เช่น.
จ้อง -F/ '
เริ่มต้น {OFS=FS; cmd = "เรียงลำดับ -d"}
{พิมพ์ $NF $0 |& cmd}
จบ {
ปิด (ซม., "ถึง");
ในขณะที่ (cmd |& getline){$1 = ""; พิมพ์};
ปิด (ซม. "จาก")
}
' ไฟล์
มีการโกงเล็กน้อยที่นี่ในเส้นทางที่แน่นอน (บรรทัดที่ขึ้นต้นด้วย /
) หมายถึงฟิลด์ว่างเริ่มต้น เพื่อจัดการเส้นทางสัมพัทธ์ที่คุณต้องเปลี่ยน พิมพ์ $NF $0
ถึง พิมพ์ $NF,$0
เพื่อแทรกตัวคั่น "ขาดหายไป" จากนั้นอาจใช้ regex ย่อย ()
แทนที่จะง่ายกว่า $1 = ""
เพื่อลบองค์ประกอบนำหน้า
รวมทั้งอาจเร็วกว่า / มีประสิทธิภาพหน่วยความจำมากกว่าแบบเพียว เพ่งพิศ
วิธีแก้ปัญหานี้ช่วยให้คนอื่นๆ เรียงลำดับ
ตัวเลือกที่จะเพิ่มโดยตรงเช่น cmd = "เรียง -d -t " FS " -k1,1r"
.