Xóa các dòng trùng lặp khỏi tệp chứa dấu thời gian


8

Câu hỏi / câu trả lời này có một số giải pháp tốt để xóa các dòng giống hệt nhau trong một tệp, nhưng sẽ không hoạt động trong trường hợp của tôi vì các dòng trùng lặp khác có dấu thời gian.

Có thể nói awk bỏ qua 26 ký tự đầu tiên của một dòng trong việc xác định trùng lặp?

Thí dụ:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:10 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:13 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:16 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:21 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:22 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:23 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon

Sẽ trở thành

[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon

(giữ dấu thời gian gần đây nhất)


4
Đúng. Nếu bạn đã đăng một số ví dụ đầu vào và đầu ra, thì điều này có thể lên tới một câu hỏi.
jasonwryan

3
Khi hỏi loại câu hỏi này, bạn cần bao gồm đầu vào và đầu ra mong muốn của bạn. Chúng tôi không thể giúp nếu chúng tôi phải đoán.
terdon

1
"Có" hoặc "không" dường như là một câu trả lời chấp nhận được, bạn sẽ làm gì với kiến ​​thức đó? Trong trường hợp không, mở rộng awk?
Anthon

1
Ồ 80.000 đại diện tuyên bố đây là một câu hỏi không thể sử dụng (tôi sẽ không gọi nó là một câu hỏi hay) nhưng không phải là một phiếu bầu gần đúng?
Hauke ​​Laging

5
@HaukeLaging có vẻ hợp lý khi cho OP cơ hội phản ứng với các bình luận của chúng tôi. Bây giờ họ đã làm như vậy và câu hỏi được cải thiện rất nhiều.
terdon

Câu trả lời:


14

Bạn chỉ có thể sử dụng uniqvới -ftùy chọn của nó :

uniq -f 4 input.txt

Từ man uniq:

  -f, --skip-fields=N
       avoid comparing the first N fields

Trên thực tế, điều này sẽ hiển thị dòng đầu tiên:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon

Nếu đó là một vấn đề bạn có thể làm:

tac input.txt | uniq -f 4

hoặc nếu bạn không có tacnhưng tailhỗ trợ của bạn -r:

tail -r input.txt | uniq -f 4

1
Điều đó thật tệ hại :)
Ramesh

3
@Ramesh Một số công cụ này có một số tùy chọn hữu ích khó chịu mà khi bạn biết chúng, hãy đánh bại mọi thứ awk / perl / python mà bạn có thể nghĩ ra.
Anthon

4
awk '!seen[substr($0,27)]++' file

Giải pháp này không bao gồm phần dấu thời gian vì đó không phải là một phần của câu hỏi khi câu trả lời này được viết.
Hauke ​​Laging

2
Đây chính xác là lý do tại sao nhiều người trong chúng ta làm việc để đóng những thứ này cho đến khi Q hoàn toàn được bổ sung. Nếu không, những Q này đang lãng phí thời gian của bạn và OP.
slm

3

Hãy thử cái này:

awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'

0

Một perlgiải pháp:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file

0

Người ta có thể sử dụng sức mạnh của vim:

:g/part of duplicate string/d

Rất dễ. Nếu bạn có thêm vài tệp (chẳng hạn như nhật ký xoay được nén ), vimsẽ mở chúng mà không cần giải nén sơ bộ về phía bạn và bạn có thể lặp lại lệnh cuối cùng bằng cách nhấn :. Cũng giống như lặp lại lệnh cuối cùng trong thiết bị đầu cuối.

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.