Komennoni lähdöt ovat jotain:
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
Ensimmäinen sarake on aina numero, Tarkoitukseni on saada vain toinen sarake, kuten:
20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . .
Aion käyttää
# 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" } }
tämän saavuttamiseksi. mutta tulos on sekaisin: (vain yksi arvo 20.00) 20.00
Joten, miten saan toisen sarakkeen arvon? (Minun tapauksessani minulla on 405 riviä, jotka vastaavat 405 arvoa ja 1 sarake)
Kommentit
vastaus
Oletetaan, että se riittää tarkistamaan ensimmäisen sarakkeen numeron:
awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out
Voit varmistaa, että tätä sovelletaan vain rivien NSET_OUTPUT
jälkeen, tekemällä jotain seuraavista:
sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out
Tämä poistaa rivejä ennen NSET_OUTPUT
ja lähettää loput komentoihin awk
.
Komentosarjasi antaa vain yhden numeron, koska se, jokaiselle syöttöriville , etsii NSET_OUTPUT
ja jos löytyy, ohita viisi riviä ennen numeron noutamista toisesta sarakkeesta.
Seuraava on kiinteä versio sinun komentosarjastasi:
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" }
Kommentit
- Pidä mielessä että komennon ulostulossa on otsikko (katso kysymysversio), joka voi sisältää esimerkiksi
3G
regex-sanasi on oltava tiukempi suodatettaessa tällaisia arvoja - @sjsam Ei melko varma, että näen sen itse (tarkistamalla versioita), mutta olen ' päivittänyt vastauksen kuitenkin (tavalla, joka tekee siitä erilaisen kuin sinun ja Stephen ' s).
Vastaa
Voimme testata nähdäksesi, aloittaako ensimmäinen kenttä numerolla, ja tulosta vain toinen
awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat
Tämä vastaa lähdetiedostoa ja palauttaa
20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 ....
kommentit
- miksi ei
[0-9]+
cozfirst column is always a number
? Myös tulo tulee selvästi komennosta, joten se tulisi lähettää putkiin - Kaikki
awk
-versiot eivät tue+
syntaksia. Kysymyksessä sanottiin, että tiedot olivat peräisin osoitteestaelectric_thermal.dat
- Hmm ,,, unohdin komentosarjassa olevan kommentin. Kiitos. Mitä tulee
+
-ohjelmaan, minulla ei ole koskaan ollut ongelmia käyttää heidän kanssaangnu/non-gnu awks
mitä versiota tarkoitit? - Vanhat vanhat järjestelmät 🙂
Vastaa
awk
on ystäväsi:
awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile
pitäisi tehdä se
Vastaa
Komento
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
Vastaa
Jos yllä olevat 7 riviä ovat pysyviä komennon suorittamisen jälkeen käytä joka kerta:
yourcommand | sed 1,7d | awk "{print $2}"
sed 1,7d
piilottaa yksinkertaisesti 7 ensimmäistä riviä, joita et vaadi . awk
lajittelee tarkan etsimäsi sisällön …
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
Kommentit
- Ääni: Hyödytön [ kissan ] , ja ratkaisu ei ' t täytä y vaatimukset. Alusta myös koodi.
Vastaa
Kokeile tätä:
awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile
Kommentit
- Opi käyttämään koodilohkoja.
tail
ja sittenawk
toiselle sarakkeelle. Ehdotan ' ehdottaisi jonkin verran varovaisuutta sisennyskoodissa, kysymyksen katkelmaa on melko vaikea tulkita, koska sisennys ja aaltosulkeet eivät täsmää.