Điểm:4

Làm cách nào để kết hợp hai tệp trong khi loại trừ các dòng tồn tại trong cả hai tệp?

lá cờ it

Tôi có 2 tệp không thể sắp xếp được. Cả hai đều có một danh sách các từ trên mỗi dòng. Tôi đang cố so sánh cả hai tệp và tạo một tệp mới không có bất kỳ dòng trùng lặp nào khớp giữa cả hai tệp. Điều này có nghĩa là nếu một dòng trên tệp A được tìm thấy trên tệp B, thì nó sẽ không hiển thị dưới dạng kết quả đầu ra.

Có một vấn đề lớn với nhiều câu hỏi và trang web có tiêu đề "Xóa các bản sao" trong khi thực tế đó là "Hợp nhất các bản sao và hiển thị một bản duy nhất". 2 điểm này rất khác nhau. Một là không thực sự xóa các dòng trùng lặp, chỉ hợp nhất chúng.

Đối với trường hợp cụ thể này, tôi thực sự cần phải XÓA CHÚNG. Vì vậy, nếu chúng được tìm thấy trong cả hai tệp, kết quả là chúng sẽ không hiển thị.

tôi đã thử rồi liên lạc rồi và điều này không thành công. Mình cũng đã test vài trường hợp khác như awk, grep mà mình từng thấy. Các quy tắc cho cả hai tệp là như sau:

  • Chúng có kích thước khác nhau (Không có cùng số lượng dòng)
  • Để trở thành một bản sao, nó so sánh toàn bộ dòng với từng dòng và tất cả các dòng khác trong tệp khác
  • Tập tin không thể được sắp xếp

Đây là một số thông tin về các tệp, chúng mang danh sách email, một email trên mỗi dòng. Tất nhiên vì chúng không có cùng kích thước, điều đó không có nghĩa là chúng sẽ có tất cả các email giống nhau, nhưng chúng có tất cả các email duy nhất bên trong nhau. Chỉ là một số email có thể có trên cả hai tệp. Đối với trường hợp email nằm trên cả hai tệp, kết quả đầu ra sẽ không hiển thị các email đó.

FedKad avatar
lá cờ cn
Lý do khiến "_Tệp không thể sắp xếp_" là gì?
N0rbert avatar
lá cờ zw
Tôi không chắc, nhưng bạn có thể dùng thử tiện ích `dwdiff` để so sánh; xem https://askubuntu.com/a/1073389/66509 để tham khảo.
lá cờ hr
Các bản sao có thể xảy ra * trong * một trong hai tệp không? Các kết quả nên được hợp nhất theo thứ tự nào? Vui lòng xem xét việc cung cấp một ví dụ tối thiểu.
Luis Alvarado avatar
lá cờ it
@steeldriver, không có bản sao nào (cảm ơn chúa) trên mỗi tệp. Tất cả đều là duy nhất)
lá cờ hr
*"nếu một dòng trên tệp A được tìm thấy trên tệp B, nó sẽ không hiển thị dưới dạng kết quả đầu ra"* nghe giống như `grep -vFxf fileB fileA`, trong khi *" nếu chúng được tìm thấy trong cả hai tệp, chúng sẽ không hiển thị dưới dạng một kết quả"* nghe giống như `awk '!seen[$0]++' fileA fileB`. Đây là nơi một ví dụ ngắn gọn, tiêu biểu sẽ hữu ích.
Luis Alvarado avatar
lá cờ it
@steeldriver Cảm ơn bạn, tôi đã thử cả hai nhưng không gặp may. Họ vẫn hiển thị đầu ra sai. Vì vậy, ví dụ một tệp có 700 email, một tệp khác có 80 email. Tôi biết một thực tế rằng hầu hết tất cả 80 email đều trùng lặp với 700 email, vì vậy số lượng đầu ra phải vào khoảng 620 email.
Luis Alvarado avatar
lá cờ it
Đính chính là mình vừa test lại cái đầu tiên nhưng để ý thấy chữ f ở cuối. Tôi đã làm nó và nó đã làm việc. Nhưng cái awk không hiển thị kết quả chính xác, mặc dù grep của bạn đã làm. Nếu bạn vui lòng đặt câu trả lời này làm câu trả lời vì điều này THỰC SỰ có tác dụng với tôi sau vài giờ.
Điểm:1
lá cờ cn

Có nhiều cách hiệu quả hơn, nhưng đây là một giải pháp. Tôi không chắc bạn muốn hợp nhất các tệp như thế nào. Vì vậy, trong giải pháp này, các dòng riêng biệt từ tệp1 được ghi vào tệp mới, sau đó các dòng riêng biệt từ tệp2 được ghi vào tệp mới.

# remove_dupes.py
từ nhập sys argv

infile1 = open( str(argv[1]), "r")
infile2 = mở( str(argv[2]), "r")
cố gắng:
    tệp ngoài = open( str(argv[3]), "w")
ngoại trừ (Lỗi chỉ mục):
    outfile = open( 'ra', "w")


if1_arr = infile1.readlines()
if2_arr = infile2.readlines()
tmp_arr = if2_arr



loại trừ = []
cho dòng trong if1_arr:
    dòng if trong if2_arr:
        loại trừ.append(dòng)
    khác:
        outfile.write(dòng)

cho dòng trong if2_arr:
    nếu dòng không bị loại trừ:
        outfile.write(dòng)

infile1.close()
infile2.close()
outfile.close()

Chạy:

python3 remove_dupes.py <file1> <file2> <output_file>

Nếu bạn muốn biến công cụ này thành một công cụ dòng lệnh nhanh hơn, hãy di chuyển tập lệnh đến một nơi lâu dài và thêm dòng sau vào tệp .bashrc, .bash_aliases, .zshrc hoặc tệp tương đương của bạn.

alias mydiff='python3 <path_to_script>'

Bạn có thể thay thế 'mydiff' bằng bất cứ tên gọi nào bạn muốn. Sau đó, bạn có thể chạy tập lệnh với:

mydiff <file1> <file2> <output_file>

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.