awk czy grep? – drukuj słowo kluczowe i następujące kolumny

Wykonałem kilka testów porównawczych i wynikiem jest pojedynczy plik zawierający wiele wyników w następującym formacie

[blaaa] 1st run T/V N NB P Q Time ========================== 2 3 4 1 2 1.02 [blaaaa...] 2nd run T/V N NB P Q Time ========================== 4 42 4 1 2 1.22 

Chcę tylko pobrać środowiska wykonawcze różnych wykonanych przeze mnie przebiegów. Czy jest więc możliwe grepowanie „Czasu” i wydrukowanie przedostatniej kolumny? Lub nawet wydrukować tylko

1.02 1.22 

dla mojego przykładu powyżej? Wolałbym wydrukować tylko trzy kolumny wyników bez części blaa: D

Komentarze

  • Masz na myśli tę samą kolumnę, a następnie jedną linia ?

Odpowiedź

Zakładając Time jest zawsze w szóstym polu:

$ awk "$6 == "Time" {t = NR} t && NR == t+2 {print $6}" file 1.02 1.22 

Alternatywnie możesz użyć getline dwa razy – szybkie „n” brudne :

awk "$6 == "Time" {getline; getline; print $6}" file 

(„dirty”, ponieważ nie sprawdza wartości zwracanej getline).

Komentarze

  • Lub użyj $NF, jeśli ' s zawsze ostatnia kolumna.
  • @Kusalananda tak dobra uwaga

Odpowiedź

$ grep -o "Time\|[0-9\.]\+$" file Time 1.02 Time 1.22 $ grep -o "[0-9\.]\+$" file 1.02 1.22 $ grep -A2 ^T/V file T/V N NB P Q Time ========================== 2 3 4 1 2 1.02 -- T/V N NB P Q Time ========================== 4 42 4 1 2 1.22 

Wyniki są oddzielone znakiem -- w ostatnim pliku grep, który można usunąć za pomocą:

$ grep -A2 ^T/V file | grep -v "^--" 

I po usunięciu ==== linii :

$ grep -A2 ^T/V file | grep -v "^--\|=\+" 

Odpowiedź

Masz dwie odpowiedzi używając awk and grep, możesz także spróbować sed:

sed -E "/===*/{N;s/.*([0-9]+\.[0-9]*)/\1/g};t;d" file_name 

Tutaj /===*/, dopasuje ===.., a następnie przejdzie do następnej linii i znajdzie liczby zmiennoprzecinkowe z dziesiętnymi między nimi oraz pominie i usunie wszystkie inne linie.

Wyświetli wynik w postaci:

1.02 1.22 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *