Jak získat druhý sloupec z výstupu příkazu?

Výstup mého příkazu je něco jako:

 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 

První sloupec je vždy číslo, mým cílem je získat pouze druhý sloupec, například:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Chtěl jsem použít

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

k dosažení tohoto cíle. ale výstup je zpackaný: (pouze jedna hodnota 20,00) 20,00

Takže, jak získám hodnotu druhého sloupce? (v mém případě mám 405 řádků odpovídajících 405 hodnotám s 1 sloupcem)

Komentáře

  • Pokud má záhlaví pevnou délku, můžete jej odstranit pouze tail a poté awk pro druhý sloupec. Navrhuji ' věnovat určitou pozornost odsazení kódu, fragment v otázce je poměrně těžké interpretovat, protože odsazení a složené závorky se neshodují.

Odpověď

Za předpokladu, že stačí zkontrolovat číslici v prvním sloupci:

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

Abyste zajistili, že se toto použije pouze na řádky za řádkem NSET_OUTPUT, můžete udělat něco jako následující:

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

Tímto způsobem odstraníte řádky před NSET_OUTPUT a zbytek odešlete do skriptu awk.


Váš skript vypíše pouze jedno číslo, protože pro každý řádek vstupu vyhledá NSET_OUTPUT a pokud je nalezen, přeskočte pět řádků před načtením čísla z druhého sloupce.

Toto je pevná verze vašeho skriptu:

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

Komentáře

  • Mějte na paměti že výstup příkazu má záhlaví (viz revize otázky), které může obsahovat věci jako 3G váš regex musí být přísnější k filtrování těchto hodnot
  • @sjsam Not docela jsem si jistý, že to vidím sám (při prohlížení revizí), ale odpověď jsem přesto ' aktualizoval (způsobem, který ji odlišuje od vaší a Stephen ' s).

Odpověď

Můžeme testovat abyste zjistili, zda první pole začíná číslem a stačí vytisknout druhé

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

Toto odpovídá zdrojovému souboru a vrátí se

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

Komentáře

  • Proč ne [0-9]+ coz first column is always a number? Jasně také vstup pochází z příkazu, takže by měl být piped
  • Ne všechny verze awk podporují + syntaxe. Otázka říkala, že data pocházejí z electric_thermal.dat
  • Hmm ,, přehlédl jsem komentář ve skriptu. Dík. Pokud jde o + nikdy jsem neměl problém s nimi používat gnu/non-gnu awks Jakou verzi jste měl na mysli?
  • Staré staré systémy 🙂

Odpověď

awk je váš přítel:

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

měl by to udělat

Odpovědět

Příkaz

 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 

Odpověď

Pokud je výše uvedených 7 řádků po provedení příkazu trvalé pokaždé použijte:

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

sed 1,7d jednoduše skryje prvních 7 řádků, které nevyžadujete . awk roztřídí přesný obsah, který skutečně hledáte …

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 

Komentáře

  • Hlasování proti: Useless [ použití kočky ] a řešení ' nesplňuje y požadavky. Také prosím naformátujte kód.

Odpověď

Zkuste toto:

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

Komentáře

  • Naučte se používat bloky kódu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *