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
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]+
cozfirst 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ą zelectric_thermal.dat
- Hmm ,,, przeoczyłem komentarz w skrypcie. Dzięki. Odnośnie
+
Nigdy nie miałem problemu z używaniem ich zgnu/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.
tail
, a następnieawk
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ą.