+1  A: 

You could use associative arrays to maintain a counter for each key on the right side.

This is a proof of a concept one liner that you can use as a starting point

$ echo "[100 ps] bar\n[139 ps] foo\n[140 ps] foo" |
  awk '{count[$3]++; if (count[$3] == 1) print;}'
[100 ps] bar
[139 ps] foo

This would have to be tweaked if the right side string can contain spaces.

Adam Byrtek
+1  A: 

Running on ideone:

 BEGIN {prev=""}

 $3==prev {next}

{ prev = $3;
 print;}
belisarius
Can you generalize this solution where the left half and right half of the string are defined by regular expressions?
Ross Rogers
@Ross Could you please add that to your question and provide an example?
belisarius
I got what I want manipulating the field separator since the middle piece of the string is constant: ``BEGIN { FS = "ps L fc";...`` .
Ross Rogers
@Ross Great! /one more char to go
belisarius
+1  A: 

what separates the right half from the left half? Is it a tab or multiple spaces? If it's a tab then:

awk -F '\t' '
    $2 in seen {next} 
    { print; seen[$2]=1 }
'

Otherwise, I'd write something like

perl -ane '
    $right_half = join " ", @F[2..-1];
    if (not $seen{$right_half}) {
        print;
        $seen{$right_half} = 1;
    }
'
glenn jackman
+1  A: 
$ awk -F"][ \t]+" '!a[$2]++' file
[100 ps]  bar
[139 ps]  foo de fa fa
[149 ps]  le pamplemouse
[177 ps]  le pomme de terre
ghostdog74