Hướng dẫn python find duplicate lines in two files - python tìm các dòng trùng lặp trong hai tệp

Từ thiết bị đầu cuối UNIX, chúng ta có thể sử dụng

sort file1 file2 | uniq -d
4 để tìm sự khác biệt giữa hai tệp. Có một lệnh tương tự để hiển thị sự tương đồng trên 2 tệp không? [Nhiều đường ống cho phép nếu cần thiết.

Mỗi tệp chứa một dòng với một câu chuỗi; Chúng được sắp xếp và trùng lặp các dòng được loại bỏ bằng

sort file1 file2 | uniq -d
5.

sort file1 file2 | uniq -d
6: //pastebin.com/tarcegvn

sort file1 file2 | uniq -d
7: //pastebin.com/2fxemrhq

Và đầu ra sẽ xuất ra các dòng xuất hiện trong cả hai tệp.

sort file1 file2 | uniq -d
8: //pastebin.com/fnjxfshs

Tôi có thể sử dụng Python để làm điều đó như vậy nhưng tôi nghĩ rằng đó là một chút quá nhiều để đưa vào thiết bị đầu cuối:

x = set[[i.strip[] for i in open['wn-rb.dic']]]
y = set[[i.strip[] for i in open['wn-s.dic']]]
z = x.intersection[y]
outfile = open['reverse-diff.out']
for i in z:
  print>>outfile, i

hỏi ngày 18 tháng 3 năm 2013 lúc 5:25Mar 18, 2013 at 5:25

Alvasalvasalvas

109K101 Huy hiệu vàng422 Huy hiệu bạc697 Huy hiệu Đồng101 gold badges422 silver badges697 bronze badges

8

Nếu bạn muốn có được một danh sách các dòng lặp đi lặp lại mà không cần dùng đến AWK, bạn có thể sử dụng cờ

sort file1 file2 | uniq -d
9 cho uniq:

sort file1 file2 | uniq -d

Đã trả lời ngày 3 tháng 3 năm 2014 lúc 20:27Mar 3, 2014 at 20:27

user35147863user35147863user35147863

2.4752 Huy hiệu vàng22 Huy hiệu bạc25 Huy hiệu Đồng2 gold badges22 silver badges25 bronze badges

1

Như @tjameson đã đề cập, nó có thể được giải quyết trong một chủ đề khác. Chỉ muốn đăng một giải pháp khác:

sort -m *.words | uniq -d >dupes.txt
0

  1. Tham khảo Hướng dẫn AWK để có được một số điều cơ bản AWK, khi giá trị mẫu của một dòng đúng là dòng này sẽ được in

  2. DUP [$ 0] là một bảng băm trong đó mỗi khóa là mỗi dòng của đầu vào, giá trị ban đầu là 0 và tăng sau khi dòng này xảy ra, khi nó xảy ra lại, giá trị phải là 1, do đó

    sort -m *.words | uniq -d >dupes.txt
    
    1 là đúng. Sau đó, dòng này được in.

Lưu ý rằng điều này chỉ hoạt động khi không có bản sao trong một trong hai tệp, như đã được chỉ định trong câu hỏi.

Đã trả lời ngày 18 tháng 3 năm 2013 lúc 5:34Mar 18, 2013 at 5:34

2

Vì tất cả các tệp đầu vào đã được sắp xếp, chúng tôi có thể bỏ qua bước sắp xếp thực tế và chỉ sử dụng

sort -m *.words | uniq -d >dupes.txt
2 để hợp nhất các tệp lại với nhau.

Trên một số hệ thống Unix [theo hiểu biết của tôi chỉ Linux], nó có thể đủ để làm

sort -m *.words | uniq -d >dupes.txt

Để có được các dòng trùng lặp được ghi vào tệp

sort -m *.words | uniq -d >dupes.txt
3.

Để tìm các tệp những dòng này đến từ, sau đó bạn có thể làm

grep -Fx -f dupes.txt *.words

Điều này sẽ hướng dẫn

sort -m *.words | uniq -d >dupes.txt
4 xử lý các dòng trong
sort -m *.words | uniq -d >dupes.txt
3 [
sort -m *.words | uniq -d >dupes.txt
6] dưới dạng các mẫu chuỗi cố định [
sort -m *.words | uniq -d >dupes.txt
7].
sort -m *.words | uniq -d >dupes.txt
4 cũng sẽ yêu cầu toàn bộ dòng hoàn hảo từ đầu đến cuối [
sort -m *.words | uniq -d >dupes.txt
9]. Nó sẽ in tên tệp và dòng vào thiết bị đầu cuối.

Unices không linux [hoặc thậm chí nhiều tệp hơn]

Trên một số hệ thống UNIX, tên tệp 30000 sẽ mở rộng thành một chuỗi quá dài để chuyển sang một tiện ích duy nhất [có nghĩa là

grep -Fx -f dupes.txt *.words
0 sẽ thất bại với
grep -Fx -f dupes.txt *.words
1, nó thực hiện trên hệ thống OpenBSD của tôi]. Ngay cả Linux cũng sẽ phàn nàn về điều này nếu số lượng tệp lớn hơn nhiều.

Tìm kiếm các bản sao

Điều này có nghĩa là trong trường hợp chung [điều này cũng sẽ hoạt động với nhiều hơn chỉ 30000 tệp], người ta phải "chunk" việc sắp xếp:

rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 

Ngoài ra, tạo

grep -Fx -f dupes.txt *.words
2 mà không cần
grep -Fx -f dupes.txt *.words
3:

rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +

Điều này sẽ tìm thấy tất cả các tệp trong thư mục hiện tại [hoặc bên dưới] có tên khớp với

grep -Fx -f dupes.txt *.words
4. Đối với một đoạn có kích thước phù hợp của các tên này tại một thời điểm, kích thước được xác định bởi ________ 33/________ 36, nó hợp nhất chúng lại với nhau thành tệp
grep -Fx -f dupes.txt *.words
2 được sắp xếp. Nếu
grep -Fx -f dupes.txt *.words
2 đã tồn tại [với tất cả trừ phần đầu tiên], tệp này cũng được hợp nhất với các tệp khác trong đoạn hiện tại. Tùy thuộc vào độ dài của tên tệp của bạn và độ dài tối đa cho phép của một dòng lệnh, điều này có thể yêu cầu nhiều hơn hoặc nhiều hơn 10 lần chạy riêng lẻ của tập lệnh nội bộ [____ 36/________ 33 sẽ tự động thực hiện việc này].

Tập lệnh "nội bộ"

rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 
1,

if [ -f tmpfile ]; then
    sort -o tmpfile -m tmpfile "$@"
else
    sort -o tmpfile -m "$@"
fi

Sử dụng

rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 
2 để xuất vào
grep -Fx -f dupes.txt *.words
2 [điều này sẽ không ghi đè lên
grep -Fx -f dupes.txt *.words
2 ngay cả khi đây cũng là một đầu vào cho
rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 
5] và
rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 
6 để thực hiện hợp nhất. Trong cả hai nhánh,
rm -f tmpfile
find . -type f -name '*.words' -print0 |
xargs -0 sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh 
7 sẽ mở rộng sang danh sách các tên tệp được trích dẫn riêng lẻ được chuyển cho tập lệnh từ
grep -Fx -f dupes.txt *.words
6 hoặc
grep -Fx -f dupes.txt *.words
3.

Sau đó, chỉ cần chạy

rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
0 trên
grep -Fx -f dupes.txt *.words
2 để có được tất cả các dòng được nhân đôi:

uniq -d tmpfile >dupes.txt

Nếu bạn thích nguyên tắc "khô" ["đừng lặp lại chính mình"], bạn có thể viết tập lệnh nội bộ là

if [ -f tmpfile ]; then
    t=tmpfile
else
    t=/dev/null
fi

sort -o tmpfile -m "$t" "$@"

hoặc

t=tmpfile
[ ! -f "$t" ] && t=/dev/null
sort -o tmpfile -m "$t" "$@"

Họ đến từ đâu vậy?

Vì những lý do tương tự như trên, chúng tôi không thể sử dụng

rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
2 để tìm những bản sao này đến từ đâu, vì vậy thay vào đó chúng tôi sử dụng lại
grep -Fx -f dupes.txt *.words
6:

sort file1 file2 | uniq -d
0

Vì không có quá trình xử lý "phức tạp" nào được thực hiện, chúng tôi có thể gọi

sort -m *.words | uniq -d >dupes.txt
4 trực tiếp từ
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
5. Tùy chọn
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
5 có lệnh tiện ích và sẽ đặt các tên được tìm thấy trong
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
7. Với
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
8 ở cuối,
grep -Fx -f dupes.txt *.words
6 sẽ đặt nhiều đối số thay cho
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
7 khi vỏ hiện tại hỗ trợ trong mỗi lần gọi tiện ích.

Hoàn toàn chính xác, người ta có thể muốn sử dụng

sort file1 file2 | uniq -d
1

hoặc

sort file1 file2 | uniq -d
2

Họ đến từ đâu vậy?

Vì những lý do tương tự như trên, chúng tôi không thể sử dụng

rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
2 để tìm những bản sao này đến từ đâu, vì vậy thay vào đó chúng tôi sử dụng lại
grep -Fx -f dupes.txt *.words
6:

Vì không có quá trình xử lý "phức tạp" nào được thực hiện, chúng tôi có thể gọi

sort -m *.words | uniq -d >dupes.txt
4 trực tiếp từ
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
5. Tùy chọn
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
5 có lệnh tiện ích và sẽ đặt các tên được tìm thấy trong
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
7. Với
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
8 ở cuối,
grep -Fx -f dupes.txt *.words
6 sẽ đặt nhiều đối số thay cho
rm -f tmpfile
find . -type f -name '*.words' -exec sh -c '
    if [ -f tmpfile ]; then
        sort -o tmpfile -m tmpfile "$@"
    else
        sort -o tmpfile -m "$@"
    fi' sh {} +
7 khi vỏ hiện tại hỗ trợ trong mỗi lần gọi tiện ích.

Hoàn toàn chính xác, người ta có thể muốn sử dụng

Để chắc chắn rằng tên tệp luôn được bao gồm trong đầu ra từ
sort -m *.words | uniq -d >dupes.txt
4.

sort file1 file2 | uniq -d
3

Biến thể đầu tiên sử dụng

if [ -f tmpfile ]; then
    sort -o tmpfile -m tmpfile "$@"
else
    sort -o tmpfile -m "$@"
fi
2 để luôn xuất ra các tên tệp khớp. Biến thể cuối cùng sử dụng thực tế là
sort -m *.words | uniq -d >dupes.txt
4 sẽ bao gồm tên của tệp phù hợp nếu có nhiều hơn một tệp được đưa ra trên dòng lệnh.

Điều này quan trọng kể từ phần cuối cùng của tên tệp được gửi đến

sort -m *.words | uniq -d >dupes.txt
4 từ
grep -Fx -f dupes.txt *.words
6 thực sự chỉ có thể chứa một tên tệp, trong trường hợp đó
sort -m *.words | uniq -d >dupes.txt
4 sẽ không đề cập đến nó trong kết quả của nó.

Tài liệu thưởng:

Phân tích lệnh ____ 36+________ 33+________ 41:

uniq -d tmpfile >dupes.txt
0 chỉ đơn giản là tạo một danh sách các tên đường dẫn từ thư mục hiện tại [hoặc bên dưới] trong đó mỗi tên đường dẫn là của một tệp thông thường [
uniq -d tmpfile >dupes.txt
1] và có thành phần tên tệp ở cuối khớp với
grep -Fx -f dupes.txt *.words
4. Nếu chỉ tìm kiếm thư mục hiện tại, người ta có thể thêm
uniq -d tmpfile >dupes.txt
3 sau
uniq -d tmpfile >dupes.txt
4, trước
uniq -d tmpfile >dupes.txt
1.

uniq -d tmpfile >dupes.txt
6 sẽ đảm bảo rằng tất cả các tên đường dẫn được tìm thấy được xuất ra với ký tự
uniq -d tmpfile >dupes.txt
7 [
uniq -d tmpfile >dupes.txt
8] là dấu phân cách. Đây là một ký tự không hợp lệ trong đường dẫn Unix và nó cho phép chúng tôi xử lý các tên đường dẫn ngay cả khi chúng chứa các ký tự mới [hoặc những thứ kỳ lạ khác].

Chủ Đề