Kuinka saada toinen sarake komentotuloksesta?

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

  • Jos otsikko on kiinteän pituinen, voit poistaa sen vain tail ja sitten awk toiselle sarakkeelle. Ehdotan ' ehdottaisi jonkin verran varovaisuutta sisennyskoodissa, kysymyksen katkelmaa on melko vaikea tulkita, koska sisennys ja aaltosulkeet eivät täsmää.

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]+ coz first 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 osoitteesta electric_thermal.dat
  • Hmm ,,, unohdin komentosarjassa olevan kommentin. Kiitos. Mitä tulee + -ohjelmaan, minulla ei ole koskaan ollut ongelmia käyttää heidän kanssaan gnu/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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *