คุณสามารถใช้คำสั่งsort
กับตัวเลือก--unique
:
sort -u input-file
หากคุณต้องการเขียนผลลัพธ์ไปที่ FILE แทนเอาต์พุตมาตรฐานให้ใช้ตัวเลือก--output=FILE
:
sort -u input-file -o output-file
คำสั่งuniq
ยังสามารถนำไปใช้ ในกรณีนี้บรรทัดที่เหมือนกันต้องเป็นผลลัพธ์ดังนั้นข้อมูลจะต้องเรียงลำดับเบื้องต้น - ขอบคุณ@RonJohnสำหรับบันทึกนี้ :
sort input-file | uniq > output-file
ฉันชอบsort
คำสั่งสำหรับกรณีที่คล้ายกันเพราะความเรียบง่าย แต่ถ้าคุณทำงานกับอาร์เรย์ขนาดใหญ่awk
แนวทางจากคำตอบของ John1024 อาจมีประสิทธิภาพมากกว่า นี่คือการเปรียบเทียบเวลาระหว่างวิธีการที่กล่าวถึงซึ่งใช้กับไฟล์ (ตามตัวอย่างด้านบน) ที่มีเกือบ 5 ล้านบรรทัด:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
ความแตกต่างที่สำคัญอื่น ๆ คือที่@Ruslanกล่าวถึง:
sort -u
จะพิมพ์ผลลัพธ์เมื่ออินพุตสิ้นสุดลงในขณะที่awk
คำสั่งนี้จะพิมพ์แต่ละบรรทัดผลลัพธ์ใหม่ทันที (สิ่งนี้อาจสำคัญกว่าสำหรับอินพุต pip กว่าไฟล์)
นี่คือภาพประกอบ:
ในตัวอย่างด้านบนการวนซ้ำ (แสดงด้านล่าง) สร้างการผสมแบบสุ่ม 500 ชุดแต่ละชุดมีความยาวอักขระสามตัวของ AD ตัวอักษร รวมกันเหล่านี้จะประปาหรือawk
sort
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done