usunąć linie, w których wartość pola jest mniejsza lub równa 3 - sed lub awk?

17

Muszę usunąć każdą linię, która ma wartość 2 lub mniej w 8. polu (kolumnie).

Moje dane wyglądają tak:

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

Rozumiem, że za pomocą awk mogę usunąć pożądane wartości i wydrukować je do innego pliku, i rozumiem, że sed edytowałby bieżący plik. W obu przypadkach muszę zachować oryginalny plik.

Uwaga : Prosimy o dokładne wyjaśnienie swoich rozwiązań. Nie wystarczy napisać polecenie, proszę opatrzyć sugestie uwagami.

Dodatkowa uwaga : Dane mają wiersz nagłówka, więc najprawdopodobniej będzie to konieczne

awk „FNR> 1”

Przypuszczam?

geokrowding
źródło

Odpowiedzi:

19

Prawie to masz.

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

gdzie

  • NR to liczba rekordów (liczba wierszy)
  • $8 ma osiem pól
  • && jest logiczne i
  • foo to oryginalny plik, niezmieniony
  • bar wynikowy plik
  • domyślną domyślną czynnością jest wydrukowanie bieżącej linii wejściowej

Pamiętaj, że nagłówek jest rozłożony od foo do paska, aby go zachować

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

gdzie

  • || jest logiczne lub
  • wiersz wejściowy jest drukowany, jeśli NR == 1 lub jeśli 8 $> 2

Aktualizacja nr 1

Aby określić zakres

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8. pole od -4 do 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) to samo, w tym nagłówek
Archemar
źródło
Świetna odpowiedź: prosta, ale dokładna, dzięki. Tak więc jestem jasny, różnica między FNR i NR w tym przypadku jest niczym, prawda? Znam człowieka stronę, na której to wyjaśnia: numer nr porządkowym bieżącego rekordu i FNR liczby porządkowej bieżącego rekordu w bieżącym pliku. Rozumiem więc, że w tym przypadku są one równe :)
geokrowding
Jeśli masz jeden plik, FNR jest zawsze NR, jeśli plik1 ma 10 linii, pierwsza linia pliku 2 miałaby NR = 11, a FNR = 1
Archemar
Cześć, chcę zrobić coś podobnego, ale akceptuję wszystko w zakresie od -4 do 4. jak bym to zrobił, ponieważ jest to jedyny sposób, w jaki mogę to zrobić obecnie awk '(NR == 1) || (8 USD = [-4-4]) 'foo> bar
Giles
1
awk nie wie o zakresie stylów matematycznych, zobacz moją edycję.
Archemar,