ฉันมีไฟล์ข้อความที่มีรายการยาว ๆ (หนึ่งรายการในแต่ละบรรทัด) บางส่วนเป็นรายการที่ซ้ำกันและฉันต้องการทราบว่าเป็นไปได้หรือไม่ (ถ้าเป็นเช่นนั้น) จะลบรายการที่ซ้ำกันได้อย่างไร ฉันสนใจที่จะทำสิ่งนี้จากภายใน vi / vim ถ้าเป็นไปได้
ฉันมีไฟล์ข้อความที่มีรายการยาว ๆ (หนึ่งรายการในแต่ละบรรทัด) บางส่วนเป็นรายการที่ซ้ำกันและฉันต้องการทราบว่าเป็นไปได้หรือไม่ (ถ้าเป็นเช่นนั้น) จะลบรายการที่ซ้ำกันได้อย่างไร ฉันสนใจที่จะทำสิ่งนี้จากภายใน vi / vim ถ้าเป็นไปได้
คำตอบ:
หากคุณพอใจกับการจัดเรียงไฟล์ของคุณคุณสามารถใช้:
:sort u
:%!uniq
เพียงแค่ลบรายการที่ซ้ำกันโดยไม่ต้องเรียงไฟล์
u
ลองสิ่งนี้:
:%s/^\(.*\)\(\n\1\)\+$/\1/
โดยจะค้นหาบรรทัดใด ๆ ตามด้วยสำเนาของตัวเองหนึ่งชุดหรือมากกว่านั้นทันทีและแทนที่ด้วยสำเนาเดียว
ทำสำเนาไฟล์ของคุณก่อนที่คุณจะลองใช้ ยังไม่ทดลอง
จากบรรทัดคำสั่งให้ทำ:
sort file | uniq > file.new
:sort u
แขวนอยู่บนไฟล์ขนาดใหญ่ของฉัน สิ่งนี้ทำงานได้อย่างรวดเร็วและสมบูรณ์แบบ ขอบคุณ!
'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
หากคุณต้องการรักษาคำสั่งซื้อ (กล่าวคือไม่ยอมรับการเรียงลำดับ) ในการเรียกใช้จากกลุ่ม:!
สามารถใช้ได้
g/^\(.*\)$\n\1/d
ใช้ได้กับฉันบน Windows ต้องเรียงลำดับเส้นก่อน
aaaa
ตามด้วยaaaabb
จะลบaaaa
ผิดพลาด
ฉันจะรวมสองคำตอบข้างต้น:
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
หากคุณสนใจที่จะดูจำนวนบรรทัดที่ซ้ำกันถูกลบออกให้ใช้ control-G ก่อนและหลังเพื่อตรวจสอบจำนวนบรรทัดที่มีอยู่ในบัฟเฟอร์ของคุณ
'uniq' is not recognized as an internal or external command, operable program or batch file.
เลือกสายในโหมดภาพบรรทัด ( Shift+ v) :!uniq
แล้ว นั่นจะจับเฉพาะรายการที่ซ้ำกันซึ่งเกิดขึ้นทีละรายการ
เกี่ยวกับวิธีการใช้งาน Uniq ใน VimL ให้ค้นหา Uniq ในปลั๊กอินที่ฉันดูแลอยู่อยู่ คุณจะเห็นวิธีต่างๆในการใช้งานที่ให้ไว้ในรายชื่อผู้รับจดหมายเป็นกลุ่ม
มิฉะนั้น:sort u
จะเป็นหนทางไป
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
หรือ
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
นี่คือคำตอบของฉันสำหรับคุณมันสามารถลบบรรทัดที่ซ้ำกันหลายบรรทัดและเก็บไว้เพียงบรรทัดเดียวเท่านั้นที่จะไม่ลบ!
ฉันจะใช้!}uniq
แต่จะใช้ได้ก็ต่อเมื่อไม่มีบรรทัดว่าง
สำหรับทุกบรรทัดในไฟล์ให้ใช้: :1,$!uniq
.
เวอร์ชันนี้จะลบเฉพาะบรรทัดซ้ำ ๆ ที่ต่อเนื่องกัน ฉันหมายถึงลบบรรทัดที่ซ้ำกันเท่านั้น การใช้แผนที่ที่กำหนดฟังก์ชันโน้ตจะยุ่งกับเส้นว่าง แต่ถ้าเปลี่ยน REGEX ให้ตรงกับจุดเริ่มต้นของบรรทัด^
จะเป็นการลบบรรทัดว่างที่ซ้ำกันออกไปด้วย
" function to delete duplicate lines
function! DelDuplicatedLines()
while getline(".") == getline(line(".") - 1)
exec 'norm! ddk'
endwhile
while getline(".") == getline(line(".") + 1)
exec 'norm! dd'
endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>
วิธีอื่นที่ไม่ใช้ vi / vim (สำหรับไฟล์ขนาดใหญ่มาก) มาจากบรรทัดคำสั่ง Linux use sort และ uniq:
sort {file-name} | uniq -u
สิ่งนี้ใช้ได้ผลกับฉันทั้ง.csv
และ.txt
awk '!seen[$0]++' <filename> > <newFileName>
คำอธิบาย: ส่วนแรกของคำสั่งจะพิมพ์แถวที่ไม่ซ้ำกันและส่วนที่สองคือหลังจากลูกศรกลางคือการบันทึกผลลัพธ์ของส่วนแรก
awk '!seen[$0]++' <filename>
>
<newFileName>