Questão Adicionando linhas customizadas ao arquivo usando um script de shell


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.


2


origem


E você realmente não pode usar algo melhor que isso? - Ignacio Vazquez-Abrams
Ok, estou disposto a usar Perl, PHP ou C ++ também. Bash seria mais elegante e esperançosamente com um melhor desempenho. Qual sua sugestão? - Alp


Respostas:


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 sort -n | uniq.

Uma variante que não os imprime em primeiro lugar (e portanto mantém a ordem original) pode armazenar os valores vistos em uma matriz e imprimir apenas 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)
}

3



... e para limpeza, execute os resultados sort -n - Chris Nava
Eu gosto dessa solução. Existe alguma maneira fácil de remover duplicatas depois disso? - Alp