Usando o AWK para imprimir a saída da combinação de número não especificado de arquivos

0

Meu objetivo é mover para um subdiretório, chamá-lo de SUB, que possui muitos arquivos de texto com 5 colunas cada e sempre o mesmo número de linhas. Eu quero um grande arquivo 'sum' que adiciona todas as colunas de 2-5, mantém a primeira coluna e gera o arquivo. Se eu sei que o número de arquivos é pequeno, isso pode ser feito da seguinte maneira:

cd SUB

numfiles=(*)
numfiles=${#numfiles[@]}

if [ $numfiles = 1 ]
then
paste * | awk '{print $1, $2, $3, $4, $5}' > sum
fi

if [ $numfiles = 2 ]
then
paste * | awk '{print $1, ($2+$7), ($3+$8), ($4+$9), ($5+$10)}' > sum
fi    

No entanto, como o número de arquivos em SUB pode estar entre 1 e 100, esse é um método complicado. Sua ajuda é apreciada!

P.S. A formatação do novo arquivo 'sum' deve ser a mesma do formato dos arquivos de texto de entrada, que parecem todos iguais. Por exemplo, se SUB contiver dois arquivos com entradas

1 2 3 4 5
2 2 3 4 5

e

1 4 2 7 1
2 2 5 1 9

o arquivo 'sum' deve ser

1 6 5 11 6
2 4 8 5 14
    
por LionHead 03.02.2015 / 00:15

2 respostas

3
awk '
    NR==FNR {
        # assuming column 1 is the same for all files, remember it.
        # only need to do this for the first file
        col1[FNR] = $1
    }
    { for (i=2; i<=NF; i++) sum[FNR,i] += $i }
    END {
        for (i=1; i<=FNR; i++) {
            printf "%s", col1[i]
            for (j=2; j<=NF; j++) printf "%s%s", OFS, sum[i,j]
            print ""
        }
    }
' file1 file2
1 6 5 11 6
2 4 8 5 14

Deve trabalhar com nawk, gawk e mawk.

    
por 03.02.2015 / 00:35
1

Aqui vai você. Isso realmente usa gawk em vez de baunilha awk . Se você realmente precisa usar true awk , acho que precisará alterar a construção h[x][y] para algo como h[x ";" y] .

cd SUB
awk '
    BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" }
    { h[FNR][1] = $1; for (n=2; n<=5; n++) { h[FNR][n] += $n } }
    END { for (r in h) { print h[r][1], h[r][2], h[r][3], h[r][4], h[r][5] } }
' *

Com sua entrada de exemplo, ela fornece a saída esperada.

Eu adicionei a configuração PROCINFO conforme recomendado nos comentários.

    
por 03.02.2015 / 00:40