Jak uzyskać drugą kolumnę z danych wyjściowych polecenia?

Dane wyjściowe mojego polecenia to:

 N O D E O U T P U T THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT NODE FOOT- NT11 NOTE 3 20.00 11 20.00 1003 23.75 1011 23.75 2003 27.52 2011 27.52 3003 31.30 3011 31.30 4003 35.08 4011 35.08 5003 38.87 5011 38.87 6003 42.67 6011 42.67 7003 46.48 7011 46.48 8003 50.29 8011 50.29 9003 54.12 9011 54.12 10003 57.95 10011 57.95 11003 61.79 11011 61.79 12003 65.64 12011 65.64 13003 69.50 13011 69.50 14003 73.37 14011 73.37 15003 77.25 15011 77.25 16003 81.14 

Pierwsza kolumna to zawsze jest liczbą, moim celem jest uzyskanie tylko drugiej kolumny, na przykład:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Chciałem użyć

# gawk -f nset_output.awk electric_thermal.dat BEGIN{ } { if($12~/NSET_OUTPUT/ ){ for(i=1;i <= 5; i++){ getline } x=$2 print x >"nset_output.dat" } } 

aby to osiągnąć. ale wynik jest pomieszany: (tylko jedna wartość 20,00) 20,00

Jak więc uzyskać wartość z drugiej kolumny? (w moim przypadku mam 405 wierszy odpowiadających wartościom 405 z 1 kolumną)

Komentarze

  • Jeśli nagłówek ma stałą długość, możesz go usunąć z tail, a następnie awk dla drugiej kolumny. Sugeruję ' d. Sugeruję ostrożność przy wcięciach kodu, fragment w pytaniu jest dość trudny do zinterpretowania, ponieważ wcięcia i nawiasy klamrowe nie pasują.

Odpowiedź

Zakładając, że wystarczy sprawdzić cyfrę w pierwszej kolumnie:

awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out 

Aby upewnić się, że zostanie to zastosowane tylko do wierszy po wierszu NSET_OUTPUT, możesz zrobić coś takiego:

sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out 

Spowoduje to usunięcie wierszy przed NSET_OUTPUT i wysłanie pozostałych do skryptu awk.


Twój skrypt wyświetli tylko jedną liczbę, ponieważ dla każdego wiersza wejścia będzie szukał NSET_OUTPUT, a jeśli zostanie znaleziony, pomiń pięć wierszy przed pobraniem liczby z drugiej kolumny.

Poniżej znajduje się ustalona wersja Twojego skryptu:

BEGIN { print_values = 0 } $12 ~ /NSET_OUTPUT/ { for (i = 1; i <= 5; i++) { getline; } print_values = 1; } print_values == 1 { x = $2; print x >"nset_output.dat" } 

Komentarze

  • Pamiętaj że wyjście polecenia ma nagłówek (patrz wersja pytania), który może zawierać takie rzeczy jak 3G twoje wyrażenie regularne musi być bardziej rygorystyczne, aby filtrować takie wartości
  • @sjsam Nie całkiem widzę to osobiście (przeglądam poprawki), ale ' zaktualizowałem jednak odpowiedź (w sposób, który różni ją od Twojej i Stephen ' s).

Odpowiedź

Możemy przetestować aby sprawdzić, czy pierwsze pole zaczyna się od liczby i po prostu drukuje drugie

awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat 

To pasuje do twojego pliku źródłowego i zwraca

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 .... 

Komentarze

  • Dlaczego nie [0-9]+ coz first column is always a number? Oczywiście dane wejściowe pochodzą z polecenia, więc powinny być przesyłane potokiem
  • Nie wszystkie wersje awk obsługują + składnia. Pytanie mówiło, że dane pochodzą z electric_thermal.dat
  • Hmm ,,, przeoczyłem komentarz w skrypcie. Dzięki. Odnośnie + Nigdy nie miałem problemu z używaniem ich z gnu/non-gnu awks O jaką wersję masz na myśli?
  • Stare, stare systemy 🙂

Odpowiedź

awk jest Twoim przyjacielem:

awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile 

powinno to zrobić

Odpowiedź

Polecenie

 awk "$1 ~ /^[0-9]*$/{print $2}" file name output 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Odpowiedź

Jeśli powyższe 7 wierszy utrzymuje się po wykonaniu polecenia za każdym razem użyj:

yourcommand | sed 1,7d | awk "{print $2}" 

sed 1,7d spowoduje po prostu ukrycie pierwszych 7 wierszy, których nie potrzebujesz . awk posortuje dokładnie treść, której faktycznie szukasz …

cat yourcommand_out | sed 1,7d | awk "{print $2}" 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Komentarze

  • Głos przeciw: bezużyteczne [ użycie cat ] , a rozwiązanie nie ' nie spełnia y wymagania. Sformatuj również kod.

Odpowiedź

Spróbuj:

awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile 

Komentarze

  • Naucz się używać bloków kodu.

Dodaj komentarz

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