2009-04-14 53 views
13

Tôi có một công cụ tạo ra các phép thử và dự đoán đầu ra. Ý tưởng là nếu tôi có một thất bại tôi có thể so sánh dự đoán với đầu ra thực tế và xem nơi họ phân kỳ. Vấn đề là đầu ra thực tế chứa một số dòng hai lần, gây nhầm lẫn diff. Tôi muốn loại bỏ các bản sao, để tôi có thể so sánh chúng một cách dễ dàng. Về cơ bản, một cái gì đó giống như sort -u nhưng không có phân loại.công cụ unix để xóa các dòng trùng lặp khỏi một tệp

Có công cụ dòng lệnh unix nào có thể thực hiện việc này không?

+0

Có thể trùng lặp [Làm cách nào để xóa các dòng trùng lặp trong một tệp trong Unix?] (Http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in- a-file-in-unix) –

Trả lời

18

uniq(1)

SYNOPSIS

uniq [OPTION] ... [INPUT [OUTPUT]]

MÔ TẢ

Huỷ tất cả ngoại trừ những dòng giống nhau liên tiếp từ INPUT (hoặc đầu vào tiêu chuẩn), ghi vào OUTPUT (hoặc đầu ra tiêu chuẩn).

Hoặc, nếu bạn muốn loại bỏ không liền kề dòng trùng lặp là tốt, đoạn này của perl sẽ làm điều đó:

while(<>) { 
    print $_ if (!$seen{$_}); 
    $seen{$_}=1; 
} 
+0

Câu trả lời Perl chỉ hoạt động nếu bạn muốn mục đầu tiên. Cuối cùng sẽ là một giải pháp khác. – Xetius

+1

Và đối với những người không biết cách sử dụng Perl, bạn chỉ cần nhập: perl -pe 'in trừ khi $ thấy {$ _} ++' [INPUT]> OUTPUT – reinierpost

+0

@Xetuis, they ' cùng dòng :) Nếu bạn muốn dòng cuối cùng, chỉ cần thiết lập các mục nhìn thấy số dòng, không in trong vòng lặp, sau đó và in chúng ra theo thứ tự của số dòng ở cuối. Nhưng tôi không nghĩ rằng đó là neded trong trường hợp này. –

1

Nếu bạn quan tâm trong việc loại bỏ liền kề dòng trùng lặp, sử dụng uniq .

Nếu bạn muốn xóa tất cả dòng trùng lặp, không chỉ các dòng liền kề, thì sẽ phức tạp hơn.

1

Đây là những gì tôi đã đưa ra trong khi chờ đợi câu trả lời ở đây (mặc dù câu trả lời đầu tiên (và được chấp nhận) đến trong khoảng 2 phút). Tôi sử dụng thay thế này trong VIM:

%s/^\(.*\)\n\1$/\1/ 

Có nghĩa là: tìm kiếm dòng mà sau khi xuống dòng chúng tôi có giống như trước, và thay thế chúng chỉ với những gì chúng ta bị bắt trong dòng đầu tiên. Tuy nhiên,

uniq chắc chắn sẽ dễ dàng hơn.

24

Bổ sung cho các câu trả lời uniq, hoạt động tuyệt vời nếu bạn không bận tâm trước tiên trước tiên hãy ghi sort vào tệp của mình. Nếu bạn cần phải loại bỏ dòng không liền kề (hoặc nếu bạn muốn loại bỏ bản sao mà không sắp xếp lại file của bạn), Perl one-liner sau nên làm điều đó (bị đánh cắp từ here):

cat textfile | perl -ne '$H{$_}++ or print' 
+0

Tôi nghĩ đây là một câu trả lời gọn gàng. Được lập trình ở Perl trong khoảng 6 năm nay và sẽ không nghĩ đến điều gì ngắn gọn như vậy – Xetius

+1

Phần Perl thực sự tiện lợi. Điều này, tuy nhiên, đủ điều kiện cho giải thưởng "Sử dụng vô ích của con mèo" :-) (xem http://partmaps.org/era/unix/award.html). Chỉ cần sử dụng " sleske

+2

Tôi chưa bao giờ nghe về giải thưởng đó! Vâng, tôi thỉnh thoảng sử dụng con mèo; Tôi không có ý tưởng ý tưởng tại sao "cat x |" trông tốt hơn " y "làm cho mắt tôi chảy máu: P –

1

Đây là một thực hiện awk , trong trường hợp môi trường không có/cho phép perl (chưa thấy một); PS: Nếu có nhiều hơn một dòng trùng lặp, sau đó điều này in kết quả đầu ra trùng lặp.

awk '{ 

# Cut out the key on which duplicates are to be determined. 
key = substr($0,2,14) 

#If the key is not seen before, store in array,else print 
if (! s[key]) 
    s[key] = 1; 
else 
    print key; 
}' 
+4

Nếu bạn chỉ xem toàn bộ dòng là khóa, điều này tương tự với các giải pháp perl: 'awk'! C [$ 0] ++ 'file' –

Các vấn đề liên quan