Adicionando linhas customizadas ao arquivo usando um script de shell

2

Eu tenho um arquivo de texto com um número arbitrário de linhas, triplas como estas:

4   5   2
12  16  6

Agora quero adicionar linhas relacionadas ao arquivo. Digamos que eu queira adicionar 4 linhas adicionais por linha que tenham valores semelhantes. As duas primeiras colunas são ligeiramente alteradas (-1 e +1 para exatamente uma delas, todas as quatro combinações) e para a terceira coluna o valor é reduzido pela metade:

4   5   2   (original row)
3   5   1   (added rows)
5   5   1
4   4   1
4   6   1
12  16  6   (original row)
11  16  3   (added rows)
13  16  3
12  15  3
12  17  3

Não importa onde as linhas são anexadas, portanto, tudo bem se as linhas adicionadas estiverem no final do arquivo.

    
por Alp 16.05.2011 / 18:09

1 resposta

3

awk :

#!/usr/bin/awk -f
BEGIN { OFS = "\t" }
{
    print
    print $1 - 1, $2, $3 / 2
    print $1 + 1, $2, $3 / 2
    print $1, $2 - 1, $3 / 2
    print $1, $2 + 1, $3 / 2
}

Isso depende um pouco de como você precisa da saída formatada, é claro. O exemplo acima assume registros de entrada separados por tabulações.

Para remover duplicatas depois disso, canalize a saída por meio de sort -n | uniq .

Uma variante que não os imprime em primeiro lugar (e assim mantém a ordem original) pode armazenar os valores vistos em uma matriz e imprimir somente os novos:

#!/usr/bin/awk -f
function printnew(a, b, c) {
    if(seen[a, b, c] != 1) {
        seen[a, b, c] = 1
        print a, b, c
    }
}

BEGIN { OFS = "\t" }

{
    printnew($1, $2, $3)
    printnew($1 - 1, $2, $3 / 2)
    printnew($1 + 1, $2, $3 / 2)
    printnew($1, $2 - 1, $3 / 2)
    printnew($1, $2 + 1, $3 / 2)
}
    
por 16.05.2011 / 18:28