次のコマンドを実行するとき:
awk '{T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "%12.7f\n",T}'
最初の行をスキップする方法はありますか?たぶん似たものでしょうかNR!=1
?
答え1
はい、似てNR!=1
いるかNR > 1
:
awk 'NR > 1 {T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "%12.7f\n",T}'
複数のファイルに対してこれを行うには、代わりに次を使用しますFNR
。
awk 'FNR > 1 {T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "%12.7f\n",T}'
(私は不平等がより明確だと思います。私たちが録音に興味を持っていることが私に明らかになりました。後ろに特定の記録。 )
答え2
次のようにコマンドとエラー処理を最適化することもできます。division by zero
空の行または数値以外のフィールドを含む行の場合は、エラーが発生し、列の値が実際に1であることを確認してください。数字計算と除算を避けるためにNF
代わりに変数を使用すると誤った結果になるため、次の手順を実行してください。
テスト入力ファイル:
6 c v g
<-- empty line
d b d s
<-- mixed of Tabs/Spaces
1 2 3 4
5 6 7 8
注文する:
awk '
{
T=nf=0;
for(i=1; i<=NF; i++) {
nf+=($i+0==$i?1:0);
T+=$i;
};
printf ("%12.7f\n", T/(nf?nf:1) );
}' infile
出力:
6.0000000
0.0000000
0.0000000
0.0000000
2.5000000
6.5000000
まあ、最初の行はスキップしてください。はい、そうすることができます
NR!=1
または、NR>1
シングル/マルチ入力で最初の行をスキップするか、
FNR!=1
各FNR>1
入力の最初の行をスキップします。