rimuovere le righe in cui il valore di un campo è inferiore o uguale a 3 - sed o awk?


17

Devo rimuovere ogni riga che abbia un valore di 2 o meno nell'ottavo campo (colonna).

I miei dati si presentano così:

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

Capisco che usando awk posso rimuovere i valori desiderati e stamparli su un altro file, e capisco che sed modificherà il file corrente. In entrambi i casi, devo conservare il file originale.

Nota : fornire spiegazioni approfondite con le soluzioni. Non è sufficiente scrivere il comando, annotare i suggerimenti.

Nota ulteriore : i dati hanno una riga di intestazione, quindi molto probabilmente sarà necessaria una soluzione

awk 'FNR> 1'

Credo?

Risposte:


19

Ce l'hai quasi fatta.

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

dove

  • NR è il numero di record (ovvero il numero di riga)
  • $8 è otto campi
  • && è logico e
  • foo è il file originale, invariato
  • bar file risultante
  • l'azione predefinita implicita è stampare la riga di input corrente

Nota che l'intestazione è a strisce da foo a bar, per mantenerlo

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

dove

  • || è logico o
  • la riga di input viene stampata se NR == 1 o se $ 8> 2

Aggiornamento n. 1

Per specificare un intervallo

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8 ° campo da -4 a 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) lo stesso, compresa l'intestazione

Ottima risposta: semplice ma completa, grazie. Solo così sono chiaro, la differenza tra FNR e NR in questo caso è nulla, giusto? Ho letto l' uomo pagina in cui spiega: NR numero ordinale del record corrente e FNR numero ordinale del record corrente nel file corrente. Quindi capisco che sono uguali in questo caso, penso :)
geokrowding

Se hai un file, FNR è sempre NR, se file1 ha 10 righe, la prima riga di file2 avrebbe NR = 11 e FNR = 1
Archemar

Ciao, voglio fare qualcosa di simile, ma accettare tutto in un intervallo compreso tra -4 e 4. Come potrei fare per fare questo, poiché questo è l'unico modo in cui riesco a pensare di farlo attualmente impacciato '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles,

1
awk non conosce la gamma di stili matematici, vedi la mia modifica.
Archemar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.