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