Trocando uma coluna do arquivo1 com arquivos do arquivo2

2

Eu tenho dois arquivos. O primeiro arquivo tem 11 colunas, por exemplo:

1 2 3 4 5 6 7 8 9 10 11

O segundo tem 10 colunas e pode ser assim:

11 22 33 44 55 66 77 88 99 100

O que quero fazer é olhar para file1, e se a coluna 7 for algum valor, por exemplo, digamos que esteja entre 14 e 15, substitua a coluna 9 do arquivo1 pelo valor da coluna 9 do arquivo2. Então, no meu exemplo acima, arquivo1 seria reescrito como:

1 2 3 4 5 6 7 8 99 10 11

Verificar se uma coluna está entre um determinado valor é trivial:

 awk '$7 < 15 && $7 >= 14

No entanto, estou tendo problemas para substituir a coluna 9 do arquivo1 pelo valor do arquivo2. file1 NÃO é necessariamente apenas uma linha. Ele pode ter qualquer número de linhas e, em cada instância em que o valor está entre 14 e 15, a coluna 9 precisa ser substituída. Se o valor for menor que 14 ou maior que 15, as colunas devem permanecer como estão. Não acredito que isso seja difícil, mas não estou tendo sorte. Ajuda seria apreciada, e obrigado antecipadamente!

    
por Dani 29.09.2015 / 12:15

2 respostas

0

Para usar o valor do 9º campo, apenas a 1ª linha de file2

awk 'NR==1{a=$9}FNR==NR{next}14<=$7&&$7<15{$9=a}1' file2 file1
    
por 29.09.2015 / 18:08
0

Para processar linha por linha dois arquivos separados em awk , em que ambos os arquivos têm o mesmo número de linhas, e você só se importa com a linha correspondente no outro arquivo - ou seja, você deseja olhe para a linha 1 do arquivo1 e linha 1 do arquivo2, depois olhe para a linha 2 de cada, etc ....

É melhor você usar paste file1 file2 | awk '{...}'

Isso é particularmente verdadeiro quando cada linha do arquivo1 tem o mesmo número de campos, e cada linha do arquivo2 tem o mesmo número de campos (mas eles não precisam ter o mesmo número de campos um do outro). / p>

Se eles tiverem um número variável de campos de forma que você precise determinar quais campos vieram do arquivo1 e quais campos vieram do arquivo2, você pode especificar um delimitador para o comando paste que você sabe que não ocorre em nenhum arquivo e em seguida, divida cada linha em awk com base nesse delimitador. Por exemplo:

paste -d: file1 file2 | awk -F: '{NF1=split($1,file1," "); NF2=split($2,file2," "); if (file1[7] <= 15 && file1[7] >= 14) { file1[9] = file2[9] }; for (i=1; i<=NF1; i++) {printf file1[i] " "}; printf "\n";}'

Isso faz o que você pede, mas faz mais do que isso; ele configura as variáveis awk para que você tenha linhas de file1 e file2 disponíveis de uma vez, junto com NF1 e NF2 como o número de campos encontrados em cada arquivo.

Se algum dia eu aprender a função getline em awk , atualizarei esta resposta com "como fazer isso com getline ()". :)

    
por 22.12.2015 / 03:41