Awk para obter a mesma coluna com o máximo arquivado

0

Eu tenho dois arquivos. Eu tenho que obter o nome correspondente do arquivo1, imprimir todo o conteúdo do arquivo1 e adicionar uma quarta coluna (exp) no arquivo 1 usando um segundo arquivo com valor máximo

file1

name             value1          value2          value3
hat_197050       30.5348         37.2617         1.2203
hat_160460       20.8679         21.0134         1.00697
hat_092950       63.875          63.2321         0.989935

file2

hat_160460  AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401 
hat_160460  AA:0003700,AA:0003707

Saída desejada:

name             value1          value2          value3  exp
hat_197050       30.5348         37.2617         1.2203
hat_160460       20.8679         21.0134         1.00697 AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401 
hat_092950       63.875          63.2321         0.989935

Eu quero usar awk . Eu escrevo esta coluna de dois pares de correspondência, mas dá apenas correspondido

awk 'FNR==NR{a[$1]=$0;next}{if(b=a[$1]){print }}' file1 file2 > matched
this command to get the file2 with max field
awk 'BEGIN { FS = "," } ;{if (NF > max) {max = NF ; line =$0}} END{print line}' file2

Eu não entendo como eu combino os dois para conseguir o que quero. Qualquer sugestão de leitura será apreciada.

    
por star 11.04.2016 / 19:46

1 resposta

1

awk '
    FNR == NR {
        # Read file1
        i=$1;
        sub($1 FS, "");
        a[i]=$0; next;
    }
    (FNR < NR) && (FNR == 1) {
        # add new column header to title row (first line of file1)
        print $0 "exp"; next;
    }
    { 
        # Read file2 and append matching line from file1
        print $0 a[$1];
    }
' file2 file1

Observe que file2 é lido antes de file1 na solução acima para extrair a primeira coluna para correspondência (e, portanto, file2 é especificado antes de file1 ). Além disso, esta solução usará a última correspondência em file2 (no seu exemplo, hat_160460 ocorre duas vezes em file2 ).

Resultado:

file1 name value1 value2 value3 exp
hat_197050 30.5348 37.2617 1.2203 
hat_160460 20.8679 21.0134 1.00697 AA:0003700,AA:0003707
hat_092950 63.875 63.2321 0.989935

Se você quiser usar a primeira correspondência em file2 , substitua a seção FNR == NR acima por

FNR == NR {
    # Read file1
    i=$1;
    sub($1 FS, "");
    if (! a[i]) a[i]=$0;
    next;
}

Resultado:

file1 name value1 value2 value3 exp
hat_197050 30.5348 37.2617 1.2203 
hat_160460 20.8679 21.0134 1.00697 AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401 
hat_092950 63.875 63.2321 0.989935
    
por 11.04.2016 / 20:12