Lệnh Unix để kiểm tra xem có hai dòng nào trong một tệp giống nhau không?


24

Có lệnh unix nào có thể kiểm tra xem có bất kỳ hai dòng nào trong một tệp giống nhau không?

Ví dụ: Xem xét một tệp sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

Chúng tôi thấy rằng câu

This is sentence X

được lặp lại.

Có lệnh nào có thể nhanh chóng phát hiện ra điều này không, để tôi có thể thực hiện nó như thế này -

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

Câu trả lời:


40

Đây là một cách để có được đầu ra chính xác mà bạn đang tìm kiếm:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

Giải trình:

$(sort sentences.txt | uniq -d)Danh sách bên trong mỗi dòng xảy ra nhiều hơn một lần. Bề ngoài grep -nFxnhìn lại một lần nữa sentences.txtcho -xkhớp chính xác với bất kỳ dòng nào trong số này -Fvà thêm số dòng của chúng-n


Chỉnh sửa của bạn chỉ vừa đủ đánh bại tôi từ việc đăng cùng một câu trả lời chính xác. +1
casey

Vì vậy, cú pháp $ (lệnh) hoạt động như một loại thay thế?
CodeBlue

2
@CodeBlue - vâng. Nó được gọi là Thay thế chỉ huy
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtsẽ hiệu quả hơn một chút và sẽ tránh được các arg list too longvấn đề tiềm ẩn .
Stéphane Chazelas

10

Không chính xác những gì bạn muốn, nhưng bạn có thể thử kết hợp sortuniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2đây là số lượng trùng lặp được tìm thấy cho dòng, từ man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

NẾU nội dung tập tin phù hợp trong bộ nhớ awklà tốt cho việc này. Một lớp lót tiêu chuẩn trong comp.lang.awk (Tôi không thể tìm kiếm một phiên bản từ máy này nhưng có vài tháng một lần) để phát hiện sự trùng lặp là awk 'n[$0]++'tính các lần xuất hiện của từng giá trị dòng và in bất kỳ lần xuất hiện nào khác với lần đầu tiên, bởi vì hành động mặc định là print $0.

Để hiển thị tất cả các lần xuất hiện bao gồm lần đầu tiên, trong định dạng của bạn, nhưng có thể theo thứ tự hỗn hợp khi có nhiều hơn một giá trị được nhân đôi, sẽ khó khăn hơn một chút:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

Hiển thị trong nhiều dòng cho rõ ràng, bạn thường chạy cùng nhau trong sử dụng thực tế. Nếu bạn làm điều này thường xuyên, bạn có thể đặt awktập lệnh vào một tệp awk -f, hoặc tất nhiên toàn bộ trong tập lệnh shell. Giống như hầu hết đơn giản, awkđiều này có thể được thực hiện rất giống với perl -n[a].

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.