Xóa dòng nếu dòng tiếp theo giống nhau


15

Tôi có thể sử dụng lệnh sed / awk nào? Chỉ cần sort -uloại bỏ tất cả các trường hợp

Đầu vào:

abc
abc
def
abc
abc
def

Sản lượng dự kiến:

abc
def
abc
def

Câu trả lời:


36

Đó là những gì uniqlệnh tiêu chuẩn dành cho.

uniq your-file

Lưu ý rằng một số uniqtriển khai như GNU uniqsẽ cung cấp cho bạn đầu tiên của một chuỗi các dòng sắp xếp giống nhau (trong đó strcoll()trả về 0) trái ngược với byte giống hệt nhau (trong đó memcmp()hoặc strcmp()trả về 0). Để buộc so sánh byte với byte bất kể việc uniqtriển khai, bạn có thể buộc miền địa phương Cbằng:

LC_ALL=C uniq your-file

7

Vim có thể đạt được điều này độc đáo:

:g/\v^(.*\n)\1/d

Hoặc nếu bạn muốn sử dụng vim như một công cụ dòng lệnh, bạn có thể làm điều này như

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

Bằng cách này, bạn không phải vật lộn với việc thoát vim sau này;)

Giải trình:

:g/

Trên tất cả các dòng phù hợp với regex này ...

\v^(.*\n)\1

Bất kỳ dòng nào theo sau nó ...

/d

chạy lệnh d elete (xóa dòng hiện tại). Các -c "wq"là để lưu các thay đổi và thoát.


Lưu ý rằng với vim 8.1.2112 ít nhất, nó không hoạt động đối với các dòng trùng lặp là hai dòng cuối cùng của tệp. Ngoài ra, nó chỉ loại bỏ một bản sao khỏi chuỗi 3 dòng trùng lặp.
Stéphane Chazelas

1
@ StéphaneChazelas ngoại trừ việc chúng tôi hiện thiếu thông số kỹ thuật cho hành vi mong muốn trong trường hợp 3 dòng, tôi có thể thấy hành vi mong muốn theo cả hai cách.
D. Ben Knoble
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.