remove linhas onde o valor de um campo é menor ou igual a 3 - sed ou awk?

13

Eu preciso remover todas as linhas que tenham um valor de 2 ou menos no 8º campo (coluna).

Meus dados são assim:

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

Eu entendo que usando o awk eu posso retirar os valores desejados e imprimi-los em outro arquivo, e eu entendo que o sed iria editar o arquivo atual. Em ambos os casos, preciso manter o arquivo original.

Nota : Por favor, forneça explicações completas com suas soluções. Não é suficiente apenas escrever o comando, anote as sugestões.

Observação adicional : os dados têm uma linha de cabeçalho, portanto a solução mais provável precisará ser

awk 'FNR >1'

Eu suponho?

    
por geokrowding 04.03.2015 / 11:09

1 resposta

16

você quase faz isso

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

onde

  • NR é o número de registros (que é o número da linha)
  • $8 é oito campos
  • && é lógico e
  • foo é o arquivo original, inalterado
  • bar arquivo resultante
  • A ação padrão implícita
  • é imprimir a linha de entrada atual

observe que o cabeçalho é distribuído de foo para bar, para mantê-lo

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

onde

  • || é lógico ou
  • a linha de entrada é impressa se NR == 1 ou se $ 8 > 2

atualizar

para especificar um intervalo

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8º campo de -4 a 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) mesmo, incluindo cabeçalho.
por 04.03.2015 / 11:16