値が 5 未満の列数を行単位で計算する必要があります。私のデータは次のとおりです。
1.2 8.9 4.5 2.8
4.9 10.1 15.3 1.1
2.1 4.3 3.9 3.3
.
.
したがって、希望の出力は次のようになります。
3
2
4
答え1
レコードあたりのフィールド数(デフォルトでは行ごとにスペースで区切られた列)はですNF
。ループを使用して、レコード内のすべてのフィールドを繰り返すことができますfor (i = 1; i <= NF; ++i)
。フィールドのデータはループ内で使用できますi
。$i
たとえば、
awk '{ count = 0; for (i = 1; i <= NF; ++i) if ($i < 5) ++count; print count }'
またはもう少し詳しく書いて、
awk '
{
count = 0
for (i = 1; i <= NF; ++i)
if ($i < 5)
++count
print count
}'
if
andステートメントの本文for
は単にステートメントであるため、追加の改行文字は必要ありません{ ... }
(Cプログラミング言語と似ていますが、Perlとは異なります)。同じ行であるステートメントを別のステートメントから切り離したくない限り、行末は必要ありません(たとえば、;
上記の2つの同等のコードスニペットの使用法の比較)。;
答え2
もう一つの方法はPerlを使うことです。
perl -alpe '$_ = grep { $_ < 5 } @F' file
grep結果のスカラー割り当ては、それを一致する要素の数に変換します。
答え3
入力を実行しtr
、次を介して負の数を識別するために使用されるすべてのダッシュを下線に変換しますdc
。
$ tr \- _ < inp.txt |
dc -e '
[q]sq
[lN1+sN]sa
[5>az0<b]sb
[?z0=q0sNlbxlNpcz0=c]sc
lcx
'