web-dev-qa-db-ja.com

タイムスタンプを含むファイルから重複行を削除する

この question/answer には、ファイル内の同一の行を削除するためのいくつかの優れた解決策がありますが、それ以外の場合は重複する行にタイムスタンプがあるため、私の場合は機能しません。

重複を判断するときに、行の最初の26文字を無視するようにawkに指示することは可能ですか?

例:

[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

になります

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

(最新のタイムスタンプを保持)

8
a coder

uniq-fオプションとともに使用するだけです。

uniq -f 4 input.txt

man uniqから:

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

実際、これは最初の行を表示します:

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

それが問題である場合、あなたはすることができます:

tac input.txt | uniq -f 4

または、tacがないが、tail-rをサポートしている場合:

tail -r input.txt | uniq -f 4
14
Anthon
awk '!seen[substr($0,27)]++' file
4
Hauke Laging

これを試してください:

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

Perlソリューション:

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

vimの力を使うことができます:

:g/part of duplicate string/d

非常に簡単。さらにいくつかのファイル(gzip圧縮されたrotatedログなど)がある場合、vimは、事前に解凍せずにファイルを開きます。を押すと、最後のコマンドを繰り返すことができます。 : そして 。ターミナルで最後のコマンドを繰り返すのと同じです。

0