Hapus garis duplikat dari file yang berisi cap waktu

8

Ini pertanyaan / jawaban memiliki beberapa solusi yang baik untuk menghapus baris identik dalam sebuah file, tapi tidak akan bekerja dalam kasus saya sejak dinyatakan duplikat garis memiliki catatan waktu.

Apakah mungkin untuk memberitahu awk untuk mengabaikan 26 karakter pertama dari suatu baris dalam menentukan duplikat?

Contoh:

[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

Akan menjadi

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

(menjaga stempel waktu terkini)

seorang programmer
sumber
4
Iya. Jika Anda memposting beberapa contoh input dan output, maka ini mungkin berjumlah pertanyaan.
jasonwryan
3
Saat menanyakan jenis pertanyaan ini, Anda harus memasukkan input dan output yang Anda inginkan. Kami tidak dapat membantu jika kami harus menebak.
terdon
1
"Ya" atau "Tidak" tampaknya merupakan jawaban yang dapat diterima, apa yang akan Anda lakukan dengan pengetahuan itu? Jika tidak, perpanjang awk?
Anthon
1
Wow. 80.000 klaim rep ini adalah pertanyaan yang tidak dapat digunakan (saya tidak akan menyebutnya yang baik) tetapi tidak satu suara dekat?
Hauke ​​Laging,
5
@ HaukeLaging tampaknya masuk akal untuk memberikan OP kesempatan untuk bereaksi terhadap komentar kami. Mereka sekarang telah melakukannya dan pertanyaannya sangat meningkat.
terdon

Jawaban:

14

Anda bisa menggunakan uniqdengan -fopsi ini:

uniq -f 4 input.txt

Dari man uniq:

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

Sebenarnya ini akan menampilkan baris pertama:

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

Jika itu masalah yang bisa Anda lakukan:

tac input.txt | uniq -f 4

atau jika Anda tidak memiliki tactetapi taildukungan Anda -r:

tail -r input.txt | uniq -f 4
Anthon
sumber
1
Itu luar biasa jahat :)
Ramesh
3
@ Ramesh Beberapa alat ini memiliki beberapa opsi berguna yang jahat, ketika Anda mengetahuinya, mengalahkan hal-hal awk / perl / python yang bisa Anda buat.
Anthon
4
awk '!seen[substr($0,27)]++' file
Hauke ​​Laging
sumber
Solusi ini tidak mencakup bagian timestamp karena itu bukan bagian dari pertanyaan ketika jawaban ini ditulis.
Hauke ​​Laging
2
Inilah sebabnya mengapa banyak dari kita bekerja untuk menutup ini sampai Q telah sepenuhnya disempurnakan. Kalau tidak, Q ini membuang-buang waktu dan OP Anda.
slm
3

Coba yang ini:

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

Sebuah perlsolusi:

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

Seseorang dapat menggunakan kekuatan vim:

:g/part of duplicate string/d

Sangat mudah. Jika Anda memiliki beberapa file lagi (seperti log yang diputar gzip ), vimakan membukanya tanpa kompresi awal di sisi Anda dan Anda dapat mengulangi perintah terakhir dengan menekan :dan . Sama seperti mengulangi perintah terakhir di terminal.

Neurotransmitter
sumber