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

17

Preciso remover todas as linhas que tenham um valor igual ou inferior a 2 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

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

Nota : forneça explicações completas com suas soluções. Não basta escrever o comando, anote sugestões.

Nota adicional : Os dados têm uma linha de cabeçalho; portanto, a solução mais provável precisará

awk 'FNR> 1'

Eu suponho?

geokrowding
fonte

Respostas:

19

Você quase entendeu.

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

Onde

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

Observe que o cabeçalho é listrado 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

Atualização # 1

Para especificar um intervalo

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8º campo de -4 a 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) mesmo, incluindo cabeçalho
Archemar
fonte
Ótima resposta: simples, mas completa, obrigado. Só para esclarecer, a diferença entre FNR e NR nesse caso não é nada, correto? Eu li a página do manual em que ela explica: número ordinal NR do registro atual e número ordinal FNR do registro atual no arquivo atual. Então eu entendo estes são iguais, neste caso, eu acho :)
geokrowding
Se você tiver um arquivo, o FNR será sempre NR, se o arquivo1 tiver 10 linhas, a primeira linha do arquivo2 terá NR = 11 e FNR = 1
Archemar
Oi, eu quero fazer algo semelhante, mas aceito tudo no intervalo de -4 a 4. como eu faria isso, pois é a única maneira que eu posso pensar em fazê-lo atualmente inoperante '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles
11
O awk não sabe sobre a faixa de estilos de matemática, veja minha edição.
Archemar 15/07/16