Hogyan lehet megszerezni a második oszlopot a parancs kimenetéből?

A parancsom kimenete valami hasonló:

 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 

Az első oszlop mindig egy szám, Célom, hogy csak a második oszlopot kapjam meg, például:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

használni kívántam

# 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" } } 

ennek megvalósításához.de, a kimenet elrontott: (csak egy érték 20.00) 20.00

Tehát, hogyan kaphatom meg a második oszlop értékét? (az én esetemben 405 sorom van, amelyek 405 értéknek felelnek meg 1 oszloppal)

Megjegyzések

  • Ha a fejléc fix hosszúságú, akkor eltávolíthatja csak tail, majd a másik oszlop awk elemével. <

javaslom, hogy vigyázzon a kód behúzására, a kérdéses részletet meglehetősen nehéz értelmezni, mivel a behúzás és a zárójel nem egyezik.

Válasz

Feltételezve, hogy elegendő egy számjegy ellenőrzéséhez az első oszlopban:

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

Annak érdekében, hogy ez csak a NSET_OUTPUT sor utáni vonalakra kerüljön, tegye a következőket:

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

Ez törli a NSET_OUTPUT előtti sorokat, a többit pedig a awk szkriptbe küldi.


A szkripted csak egy számot ad ki, mivel minden bemeneti sorhoz megkeresi a NSET_OUTPUT szót, és ha megtalálható, akkor ugorjon öt sorral, mielőtt lekérné a számot a második oszlopból.

Az alábbiakban a a szkripted fix változata jelenik meg:

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" } 

Megjegyzések

  • Szem előtt tartva hogy a parancs kimenetének van egy fejléce (lásd a kérdés átdolgozását), amely tartalmazhat olyan dolgokat, mint 3G, a regexnek szigorúbbnak kell lennie az ilyen értékek szűréséhez.
  • @sjsam Nem egészen biztos, hogy ezt magam is látom (átnézem a módosításokat), de ' ennek ellenére frissítettem a választ (oly módon, hogy az különbözzen a tiédtől és Stephen ' s).

Válasz

Tesztelhetünk megnézni, hogy az első mező számmal kezdődik-e, és csak ki kell nyomtatni a másodikat

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

Ez megegyezik a forrásfájljával és visszatér

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

Megjegyzések

  • Miért nem [0-9]+ coz first column is always a number? Ugyancsak egyértelműen a bemenet egy parancsból származik, ezért át kell vezetni
  • A awk nem minden verziója támogatja a + szintaxis. A kérdés azt mondta, hogy az adatok a következőből származnak: electric_thermal.dat
  • Hmm ,,, elnéztem a szkript kommentjét. Köszönöm. A + -et illetően soha nem volt problémám velük használni a gnu/non-gnu awks -et, melyik verzióra gondoltál?
  • Régi régi rendszerek 🙂

Válasz

awk a barátod:

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

meg kell tennie

Válasz

Parancs

 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 

Válasz

Ha a fenti 7 sor a parancs végrehajtása után is állandó minden alkalommal használja:

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

sed 1,7d egyszerűen elrejti az első 7 sort, amelyekre nincs szüksége A awk rendezi a pontosan keresett tartalmat …

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 

Megjegyzések

  • Szavazás: Haszontalan [ macska ] , és a megoldás nem felel meg ' t y a követelményeket. Kérjük, formázza a kódot is.

Válasz

Próbálja ki:

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

Megjegyzések

  • Kérjük, tanulja meg a kódblokkok használatát.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük