Hoe krijg ik de tweede kolom uit de opdrachtuitvoer?

De uitvoer van mijn commando is zoiets als:

 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 

De eerste kolom is altijd een getal, mijn doel is om alleen de tweede kolom te krijgen, zoals:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Ik was van plan

om dit te bereiken. maar de uitvoer is in de war: (slechts één waarde 20,00) 20,00

Dus, hoe kom ik aan de waarde van de tweede kolom? (in mijn geval heb ik 405 rijen die overeenkomen met 405 waarden met 1 kolom)

Opmerkingen

  • Als de koptekst een vaste lengte heeft, zou je deze kunnen verwijderen met slechts tail, en dan awk voor de andere kolom. Ik ' d stel voor voorzichtig te zijn bij het inspringen van code, het fragment in de vraag is vrij moeilijk te interpreteren omdat de inspringing en de accolades niet overeenkomen.

Antwoord

Ervan uitgaande dat het voldoende is om te controleren op een cijfer in de eerste kolom:

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

Om ervoor te zorgen dat dit alleen wordt toegepast op regels na de regel NSET_OUTPUT, kunt u zoiets als het volgende doen:

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

Hiermee worden regels vóór NSET_OUTPUT verwijderd en de rest naar het awk -script gestuurd.


Uw script zal slechts één nummer uitvoeren aangezien het, voor elke invoerregel , zal zoeken naar NSET_OUTPUT, en indien gevonden, overslaan vijf regels voordat het nummer uit de tweede kolom wordt opgehaald.

Het volgende is een vaste versie van uw script:

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

Reacties

  • In gedachten houden dat de uitvoer van de opdracht een koptekst heeft (zie de revisie van de vraag) die dingen kan bevatten als 3G je regex moet strenger zijn om dergelijke waarden te filteren
  • @sjsam Niet redelijk zeker zie ik dat zelf (kijkend door de revisies), maar ik ' heb het antwoord toch bijgewerkt (op een manier die het anders maakt dan het jouwe en Stephen ' s).

Antwoord

We kunnen testen om te zien of het eerste veld begint met een getal en druk gewoon het tweede af

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

Dit komt overeen met je bronbestand en geeft

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

Reacties

  • Waarom niet [0-9]+ coz first column is always a number? Het is ook duidelijk dat de invoer afkomstig is van een commando, dus het moet worden doorgesluisd.
  • Niet alle versies van awk ondersteunen de + syntaxis. De vraag zei dat de gegevens afkomstig waren van electric_thermal.dat
  • Hmm ,,, ik heb de opmerking in het script over het hoofd gezien. Bedankt. Met betrekking tot + Ik heb nooit een probleem gehad om ermee te gebruiken met gnu/non-gnu awks Welke versie bedoelde je?
  • Oude oude systemen 🙂

Answer

awk is je vriend:

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

zou het moeten doen

Antwoord

Commando

 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 

Antwoord

Als de bovenstaande 7 regels blijvend zijn na het uitvoeren van het commando gebruik elke keer:

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

sed 1,7d zal gewoon de eerste 7 regels verbergen, die je niet nodig hebt . awk sorteert de exacte inhoud waarnaar u daadwerkelijk op zoek bent …

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 

Reacties

  • Downvote: nutteloos [ gebruik van cat ] , en de oplossing voldoet niet ' t y de vereisten. Formatteer de code ook.

Antwoord

Probeer dit:

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

Reacties

  • Leer codeblokken gebruiken.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *