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
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!
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
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 ()". :)