Removendo duplicatas a cada número X de linhas

2

É possível remover apenas o AWD015F11 duplicado usando o Awk? Eu tenho um arquivo grande com uma coluna. Isso acontece a cada 24 linhas.

Eu tentei contar as linhas em busca de um padrão que eu pudesse usar. Como você pode ver, existem outras linhas duplicadas, mas o problema é apenas com AWD015F11 .

5000
5000
false
false
AWD015F11
425
25
34
1
5000
5000
320
320
OH,AWD015F
false
true
8
50
32
0
5
9
9
true
-34
0
false
false
AWD015F11
AWD015G21
    
por Curry Murtag 19.06.2015 / 08:43

3 respostas

2

Se você puder usar PERL , use o código abaixo para remover todas as duplicatas do arquivo. Ele imprimirá a primeira linha AWD ###### e o restante seguindo isso em qualquer parte do arquivo não será impresso.

#!/usr/bin/perl
%data=();
foreach $r ( <STDIN> ) {
    chomp($r);
    if($r =~ /^AWD[A-Za-z0-9]{6}$/){
        if(!exists($data{$r})){
            $data{$r} = 1;
            print "$r\n";
        }
    } else {
        print "$r\n";
    }
}

Link para ideone: link

Acho que é isso que você quer.

    
por 19.06.2015 / 09:25
0

com awk

awk '!/^AWD015F11$/ {print $0}; /^AWD015F11$/ && found<1 {found++; print $0}' foo

Exemplo

$ cat foo | wc -l
30

$ awk '!/^AWD015F11$/ {print $0}; /^AWD015F11$/ && found<1 {found++; print $0}' foo | wc -l
29

$ cat foo
5000
5000
false
false
AWD015F11
425
25
34
1
5000
5000
320
320
OH,AWD015F
false
true
8
50
32
0
5
9
9
true
-34
0
false
false
AWD015F11
AWD015G21

$ awk '!/^AWD015F11$/ {print $0}; /^AWD015F11$/ && found<1 {found++; print $0}' foo
5000
5000
false
false
AWD015F11
425
25
34
1
5000
5000
320
320
OH,AWD015F
false
true
8
50
32
0
5
9
9
true
-34
0
false
false
AWD015G21
    
por 19.06.2015 / 13:17
-1
n=$(set '' p n p n;printf "\n%b$@$@$@$@$@$@\n \c")
sed -ne"/^AWD015F11/{:n$n$n};s///;t" -ep <in

funciona com sed . Apenas n;p 23 vezes depois de ver ^AWD e depois se recusa a imprimir mesmo.

    
por 19.06.2015 / 21:22