ตัวอย่างที่แนะนำของคุณ (ด้านล่าง) ไม่ทำงานเนื่องจากคุณจะต้องอ่านและเขียนไฟล์เดียวกันพร้อมกัน
$ cat filename | sort | uniq > filename
แนวคิดที่มีไพพ์หรือการเปลี่ยนทิศทางคือคำสั่งทางด้านซ้ายและขวาของแต่ละไพพ์หรือการรีไดเร็กต์พร้อมกัน คำสั่งทางด้านขวาประมวลผลข้อมูลตามที่ได้รับจากคำสั่งทางด้านซ้ายในขณะที่คำสั่งทางด้านซ้ายยังคงทำงานอยู่
เพื่อให้สถานการณ์ของคุณทำงานคำสั่งที่อ่านจากไฟล์จะต้องทำให้เสร็จก่อนที่คำสั่งที่เขียนไปยังไฟล์จะเริ่มต้นขึ้น เพื่อให้สิ่งนี้ใช้งานได้คุณจะต้องเปลี่ยนเส้นทางเอาต์พุตไปยังตำแหน่งชั่วคราวก่อนจากนั้นเมื่อเสร็จแล้วให้ส่งมันจากตำแหน่งชั่วคราวกลับไปที่ไฟล์
วิธีที่ดีกว่าในการทำเช่นนี้โดยทั่วไปคือในตัวอย่างก่อนหน้าของคุณที่คุณเปลี่ยนเส้นทางไปยังไฟล์ชั่วคราวจากนั้นเปลี่ยนชื่อไฟล์นั้นกลับไปเป็นต้นฉบับ (ยกเว้นว่าคุณไม่จำเป็นต้องลบไฟล์ก่อนเนื่องจากการลบเป้าหมายที่มีอยู่แล้ว) .
$ cat filename | sort | uniq > result
$ mv -f result filename
คุณสามารถบันทึกลงในตัวแปรสตริงได้ยกเว้นว่าจะใช้งานได้เมื่อข้อมูลมีขนาดเล็กพอที่จะใส่ลงในหน่วยความจำพร้อมกันทั้งหมด
echo $(cat filename | sort | uniq > result) > filename
หรือบางสิ่งบางอย่าง ? เพียงผ่านฉันไม่มีเวลาลอง