eliminar líneas donde el valor de un campo es menor o igual a 3 - sed o awk?

17

Necesito eliminar cada línea que tenga un valor de 2 o menos en el octavo campo (columna).

Mis datos se ven así:

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

Entiendo que usando awk puedo quitar los valores deseados e imprimirlos en otro archivo, y entiendo que sed editaría el archivo actual. En cualquier caso, necesito conservar el archivo original.

Nota : Proporcione explicaciones detalladas con sus soluciones. No es suficiente simplemente escribir el comando, anote las sugerencias.

Nota adicional : los datos tienen una línea de encabezado, por lo que la solución más probable será

awk 'FNR> 1'

¿Supongo?

geokrowding
fuente

Respuestas:

19

Casi lo tienes.

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

dónde

  • NR es el número de registro (es decir, el número de línea)
  • $8 es ocho campo
  • && es lógico y
  • foo es el archivo original, sin cambios
  • bar archivo resultante
  • la acción implícita predeterminada es imprimir la línea de entrada actual

Tenga en cuenta que el encabezado se raya de foo a bar, para mantenerlo

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

dónde

  • || es lógico o
  • la línea de entrada se imprime si NR == 1 o si $ 8> 2

Actualización n. ° 1

Para especificar un rango

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8vo campo de -4 a 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) mismo, incluido el encabezado
Archemar
fuente
Gran respuesta: simple pero minucioso, gracias. Para que quede claro, la diferencia entre FNR y NR en este caso es nada, ¿correcto? He leído la página del manual donde se explica: el número ordinal NR del registro actual y el número ordinal FNR del registro actual en el archivo actual. Así que entiendo que sean iguales en este caso, creo :)
geokrowding
Si tiene un archivo, FNR siempre es NR, si el archivo1 tiene 10 líneas, la primera línea del archivo2 tendría NR = 11 y FNR = 1
Archemar
Hola, quiero hacer algo similar, pero acepto todo en un rango de -4 a 4. ¿Cómo haría para hacer esto, ya que esta es la única forma en que puedo pensar en hacerlo actualmente awk '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles
1
awk no sabe acerca del rango de estilo matemático, mira mi edición.
Archemar