コマンドの出力は次のようになります。
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行があります)
コメント
回答
最初の列の数字を確認するのに十分であると仮定します:
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]+
cozfirst 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
コメント
- コードブロックの使い方を学んでください。
tail
だけで、他の列はawk
です。 'コードのインデントに注意することをお勧めします。インデントと中括弧が一致しないため、質問のスニペットを解釈するのは非常に困難です。