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
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]+
cozfirst 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 vanelectric_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 metgnu/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.
tail
, en danawk
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.