コマンド出力から2番目の列を取得するにはどうすればよいですか?

コマンドの出力は次のようになります。

 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 

最初の列は次のとおりです。常に数字です。私の目的は、次のように2番目の列のみを取得することです。

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

使用するつもりでした

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

これを達成するために。しかし、出力が台無しになっています:( 1つの値のみ20.00)20.00

では、2番目の列の値を取得するにはどうすればよいですか? (私の場合、1列の405値に対応する405行があります)

コメント

  • ヘッダーが固定長の場合は、削除できますtailだけで、他の列はawkです。 'コードのインデントに注意することをお勧めします。インデントと中括弧が一致しないため、質問のスニペットを解釈するのは非常に困難です。

回答

最初の列の数字を確認するのに十分であると仮定します:

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

これがNSET_OUTPUT行の後の行にのみ適用されるようにするには、次のようにします。

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

これにより、NSET_OUTPUTの前の行が削除され、残りがawkスクリプトに送信されます。


スクリプトは入力のすべての行に対して NSET_OUTPUTを検索し、見つかった場合はスキップするため、1つの数値のみを出力します。 2番目の列から数値を取得する前の5行。

以下は、スクリプトの固定バージョンです。

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

コメント

  • 覚えておいてくださいコマンド出力に3Gのようなものを含むことができるヘッダー(質問のリビジョンを参照)があること。このような値をフィルタリングするには、正規表現をより厳密にする必要があります
  • @sjsam Not かなり確かに(改訂を見て)自分で確認できますが、それでも'回答を更新しました(あなたの回答とは異なる方法で、 Stephen ' s)。

回答

テストできます最初のフィールドが数字で始まっているかどうかを確認し、2番目のフィールドを出力するだけです

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

これはソースファイルと一致し、戻ります

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

コメント

  • なぜ[0-9]+ coz first column is always a number?また、明らかに入力はコマンドからのものであるため、パイプする必要があります
  • awkのすべてのバージョンが+構文。質問によると、データはelectric_thermal.dat
  • うーん、、、スクリプトのコメントを見落としていました。ありがとう。 +についてgnu/non-gnu awksで問題なく使用できました。どのバージョンを意味しましたか?
  • 古い古いシステム:-)

回答

awkはあなたの友達です:

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

実行する必要があります

回答

コマンド

 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 

回答

コマンドの実行後も上記の7行が続く場合毎回、次を使用します。

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

sed 1,7dは、最初の7行を非表示にするだけで、不要です。 。awkは実際に探しているコンテンツを正確に分類します…

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 

コメント

  • 反対票:役に立たない [猫の使用] 、そしてソリューションは' t satisf y要件。また、コードをフォーマットしてください。

回答

これを試してください:

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

コメント

  • コードブロックの使い方を学んでください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です