Làm thế nào để loại bỏ một phần trùng lặp trong bash?


0

Làm cách nào tôi có thể loại bỏ các bản sao một phần trong bash bằng cách sử dụng awk, grep hoặc sort?
Tôi đã thử sort -u FILE | uniq -w20nhưng nó không thực sự đáng tin cậy.

Đầu vào:

http://www.website.com/1.file
http://www.website.com/2.file
http://www.website.com/3.file
http://www.someotherwebsite.com/1.file
http://www.someotherwebsite.com/2.file
http://www.someotherwebsite.com/3.file

Đầu ra dự kiến:

http://www.website.com/3.file
http://www.someotherwebsite.com/3.file

2
Vui lòng làm rõ những gì bạn có nghĩa là "loại bỏ trùng lặp một phần".
gogators

Vui lòng cung cấp đầu vào mẫu và đầu ra mong muốn. Ngoài ra, giải pháp có thể biết trước văn bản phổ biến là gì không, hay nó nên khám phá chuỗi chung dài nhất? Chuỗi đó phải được neo vào đầu dòng? Có thể là đầu vào sẽ chứa nhiều nhóm khác nhau với các phần chung khác nhau, hoặc có một chuỗi chung cho mỗi đầu vào không?
Eric Renouf

@EricRenouf Xong. Đây là danh sách các url có đường dẫn tương tự.
dùng669761

Có direcotires trong các URL là tốt, hoặc chỉ lưu trữ và tập tin?
Eric Renouf

@EricRenouf Không chỉ lưu trữ và tập tin.
dùng669761

Câu trả lời:


1

Một giải pháp nếu tất cả các chuỗi phổ biến được hình thành tốt như thế này là sử dụng awkvà sử dụng ba trường đầu tiên làm khóa như:

awk -F/ '{a[$1$2$3]=$0} END {for(k in a) {print a[k]}}'

Điều này sẽ phân chia từng dòng thành các trường dựa trên /như là dấu phân cách. Chúng tôi sử dụng 3 trường đầu tiên làm khóa trong một mảng và lưu trữ toàn bộ dòng làm giá trị.

Khi chúng ta đã hoàn thành với đầu vào, chúng ta sẽ đi theo mảng và in giá trị, đây sẽ luôn là dòng cuối cùng khớp với khóa đã cho.

Theo đề xuất, chúng tôi có thể làm cho điều này linh hoạt hơn một chút bằng cách chỉ cần tước bỏ phần cuối cùng và so sánh phần còn lại:

awk -F/ '{orig=$0; $NF=""; a[$0]=orig} END {for(k in a) {print a[k]}}'

sẽ lưu toàn bộ dòng không thay đổi, làm cho trường cuối cùng là chuỗi trống, sau đó thực hiện cùng một phần còn lại của mảng làm việc như trước.


Tại sao không chỉ so sánh cho đến dấu gạch chéo cuối cùng/124.ts
user669761

@ user669761 bây giờ bao gồm một cách để làm điều đó, đề xuất tốt
Eric Renouf
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.