Filtra blocos de dados inconsistentes

3

Eu gostaria de filtrar as linhas que possuem valores genéricos inconsistentes em blocos de peças de linha. No caso de valores consistentes duplicados, apenas manteria a primeira linha. Por exemplo, 'gf345 part1' tem mais de um valor geno, portanto, exclua este bloco, 'gf345 part3' é repetido com um único valor geno AT, portanto, mantenha apenas a primeira linha.

line part serial geno
ax211 part1 1234 AA
gf345  part1 1345 TT
gf345  part1  3456 AA
gf345  part1 1346 TT
ax211 part2 1834 AA
gf345  part2 1395 TT
gf345  part2  3656 AA
gf345  part2 13746 TT
ax211 part3 1634 AA
gf345  part3 13345 AT
gf345  part3  34256 AT
gf345  part3 13446 AT

Saída esperada

line part serial geno
ax211 part1 1234 AA
ax211 part2 1834 AA
ax211 part3 1634 AA
gf345  part3 13345 AT

isto é o que eu tentei.

awk     'FNR==NR        {a[$1$2]+=$4;  b[$1$2]=$4;next}
                    $1$2 in b  {if (a[$1$2] ==1 ) print $0 }
        ' file file
    
por rita kadm 11.01.2015 / 01:36

1 resposta

1

Acho que o mais fácil é classificar primeiro a entrada. Essa solução evita usar uma matriz, o que limitaria o tamanho do arquivo de entrada que você pode manipular.

Se a classificação não for um problema, isso deve funcionar:

sort file | awk '{
        if ($1$2 != key) {
                if (valid == 1)
                        print firstline;
                firstline=$0;
                key=$1$2;
                value=$4;
                valid=1
        }
        else {
                if ($4 != value)
                        valid = 0
        }
} END {
        if (valid == 1)
                print firstline
}'
    
por 12.01.2015 / 18:38

Tags