วิธีการเรียงลำดับไฟล์ในสถานที่


205

เมื่อเราใช้sort fileคำสั่งไฟล์จะแสดงเนื้อหาในแบบเรียงลำดับจะเกิดอะไรขึ้นถ้าฉันไม่ต้องการรับเอาต์พุตใด ๆ แต่เป็นไฟล์ที่เรียงลำดับ


โปรดอัปเดตคำถามของคุณเพื่ออธิบายให้ชัดเจนว่าคุณต้องการทำอะไรกับผลลัพธ์ของการเรียงลำดับไฟล์ คุณต้องการเรียงลำดับแทนที่เนื้อหาที่ไม่เรียงลำดับfileด้วยเนื้อหาเรียงลำดับของไฟล์เดียวกันหรือไม่? วิธีตอบคำถามของคุณในปัจจุบันการไม่ทำอะไรเลยเป็นคำตอบที่ถูกต้อง (คุณไม่ต้องการผลลัพธ์ใด ๆ ดังนั้นอย่าทำอะไรเลย)
Keith Thompson

@ KeithThompson ขอบคุณสำหรับความกังวลของคุณจริงฉันพยายามเรียงลำดับไฟล์ แต่ต้องการหลีกเลี่ยงการแสดงผลบนหน้าจอ
Ali Sajid

ดังนั้นคุณต้องการส่งออกไปที่ไหน เป็นไฟล์ใหม่? เป็นไฟล์ต้นฉบับ? ลงเครื่องพิมพ์ไปที่ห้องโถงหรือไม่?
Keith Thompson

1
เป็นไฟล์ดั้งเดิม
Ali Sajid

เรียกใช้sort infile >outfileและคุณจะได้รับผลลัพธ์ที่เรียงเป็นไฟล์ "outfile" จากนั้นคุณสามารถลบ "infile" ดั้งเดิมและทุกอย่างจะโอเค
Luis Colorado

คำตอบ:


408

คุณสามารถใช้การเปลี่ยนเส้นทางไฟล์เพื่อเปลี่ยนเส้นทางเอาต์พุตที่เรียงลำดับ:

sort input-file > output_file

หรือคุณสามารถใช้-o, --output=FILEตัวเลือกของการจัดเรียงเพื่อระบุ input และ output ไฟล์เดียวกัน:

sort -o file file

หมายเหตุ:ข้อผิดพลาดทั่วไปคือพยายามเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์อินพุตเดียวกัน (เช่นsort file > file) สิ่งนี้ใช้ไม่ได้เนื่องจากเชลล์กำลังทำการเปลี่ยนเส้นทาง (ไม่ใช่โปรแกรมsort (1) ) และอินพุตไฟล์ (เช่นเดียวกับเอาต์พุต) จะถูกลบก่อนที่จะให้โอกาสในการอ่านsort (1)


88
บันทึกที่ดีเกี่ยวกับความผิดพลาดทั่วไป
Drakes

1
สิ่งนี้มีประโยชน์จริง ๆ เมื่อคุณต้องการแก้ไขพจนานุกรมด้วยตนเองสำหรับ LaTeX, +1
Bryson S.

6
เพียงแค่พูดถึงความสำคัญของการสั่งซื้อ จากGNU sortหน้าข้อมูล: -o OUTPUT-FILE' - เอาต์พุต = OUTPUT-FILE 'เขียนเอาต์พุตไปยัง OUTPUT-FILE แทนเอาต์พุตมาตรฐาน สำหรับระบบที่ใหม่กว่า-o' cannot appear after an input file if POSIXLY_CORRECT 'จะถูกตั้งค่าเช่นsort F -o F'. Portable scripts should specify -o OUTPUT-FILE' ก่อนไฟล์อินพุตใด ๆ
Yassine ElBadaoui

14
เพื่อหลีกเลี่ยงการทำซ้ำชื่อไฟล์:sort -o file{,}
tstenner

65

sortคำสั่งพิมพ์ผลของการดำเนินการคัดแยกออกมาตรฐานตามค่าเริ่มต้น เพื่อให้บรรลุการเรียงลำดับ "ในสถานที่" คุณสามารถทำได้:

sort -o file file

สิ่งนี้จะเขียนทับอินพุตfileด้วยเอาต์พุตที่เรียงลำดับ -oสวิทช์ที่ใช้ในการระบุการส่งออกที่จะถูกกำหนดโดย POSIXดังนั้นควรจะสามารถใช้ได้กับรุ่นทั้งหมดsort:

-o ระบุชื่อของไฟล์เอาต์พุตที่จะใช้แทนเอาต์พุตมาตรฐาน ไฟล์นี้สามารถเหมือนกับหนึ่งในอินพุตไฟล์

หากคุณโชคร้ายพอที่จะมีรุ่นที่sortไม่มี-oสวิตช์ ( Luisยืนยันกับพวกเขาว่ามีตัวตนอยู่) คุณสามารถแก้ไข "แบบแทนที่" ได้ด้วยวิธีมาตรฐาน:

sort file > tmp && mv tmp file

2
+ ^ สำหรับคำตอบที่ดีที่สุดและด้วยคำถามที่คลุมเครือเช่นกัน แต่ยังอยู่ในอันดับบนสุดของหน้าดังนั้นต้องการการปรับปรุง
u2n

6
sort file | sponge file

นี่คือแพ็คเกจ Fedora ต่อไปนี้:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
สิ่งนี้ยังทำงานบน Ubuntu หลังจากติดตั้งด้วยsudo apt install moreutils
Serge Stroobandt

4

ในการจัดเรียงไฟล์ให้ลอง:

echo "$(sort your_file)" > your_file

ตามที่อธิบายไว้ในคำตอบอื่น ๆ คุณไม่สามารถเปลี่ยนเส้นทางผลลัพธ์กลับไปยังไฟล์อินพุตได้โดยตรง แต่คุณสามารถประเมินsortคำสั่งก่อนแล้วจึงเปลี่ยนเส้นทางกลับไปเป็นไฟล์ต้นฉบับ ด้วยวิธีนี้คุณสามารถใช้การเรียงลำดับแบบแทนที่

ในทำนองเดียวกันคุณยังสามารถใช้เคล็ดลับนี้กับคำสั่งอื่นเช่นpasteใช้การต่อท้ายแถวที่ชาญฉลาด


1
นี่เป็นสิ่งที่ไม่ดีเพราะมันจะไม่ทำงานสำหรับไฟล์ขนาดใหญ่การปิดกั้นการขึ้นบรรทัดใหม่echoสามารถยุ่งกับแบ็กสแลช escapes ใน POSIX และ-oทำงานกับไฟล์เดียวกับอินพุตตามที่อธิบายไว้ที่: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东法轮功病六四事件法轮功

4

นี่คือวิธีการที่ (ab) ใช้vim:

vim -c :sort -c :wq -E -s "${filename}"

-c :sort -c :wqคำสั่งส่วนจะเรียกไปเป็นกลุ่มหลังจากเปิดแฟ้ม -Eและ-sมีความจำเป็นเพื่อให้กลุ่มดำเนินการในโหมด "หัวขาด" ซึ่งไม่ได้วาดไปยังสถานี

สิ่งนี้แทบไม่มีประโยชน์มากกว่าsort -o "${filename}" "${filename}"วิธีการยกเว้นว่าใช้อาร์กิวเมนต์ชื่อไฟล์เพียงครั้งเดียวเท่านั้น


สิ่งนี้มีประโยชน์สำหรับฉันที่จะใช้formatterคำสั่งในnanorcรายการสำหรับ.gitignoreไฟล์ นี่คือสิ่งที่ฉันใช้:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
คุณกำลังใช้เสียงเรียกเข้าในของคุณnanorc? โอ้คำประชด
Brett Holman

2

คุณต้องการเรียงลำดับไฟล์ทั้งหมดในโฟลเดอร์และโฟลเดอร์ย่อยที่แทนที่ไฟล์เหล่านั้นหรือไม่?

ใช้สิ่งนี้:

find . -type f -exec sort {} -o {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.