
浮動小数点形式の数値を含むファイルがあります。 「グループ化」して見ることが
できます。sort -rn numbers.txt | less
つまり、同じ範囲に何個あるかを簡単に確認できます。
ファイルの例を見てください。
30.9695041179657
30.8851490020752
30.2127060890198
29.1361880302429
26.4587681293488
25.8535399436951
25.7361891269684
25.7305450439453
25.1068568229675
24.7598769664764
24.3106801509857
24.0782940387726
私は正確さに興味がありません。したがって、ファイル内のすべての数字について25が何人かを知りたいと思います。たとえば、この場合は4と30などがあります。
したがって、この例では、出力は30の場合3、29の場合1、26の場合1、25の場合4、24の場合3です。
これを行う簡単な方法はありますか?
答え1
どうですか?
cut -d. -f1 numbers.txt | sort | uniq -c
サンプルデータを使って
$ cut -d. -f1 numbers.txt | sort | uniq -c
3 24
4 25
1 26
1 29
3 30
答え2
そしてawk
(mawk
):
$ awk -F . '{COUNTS[$1]++} END{for(ct in COUNTS) {printf("%d %d time(s)\n", ct, COUNTS[ct])}}' test.txt
30 3 time(s)
24 3 time(s)
25 4 time(s)
26 1 time(s)
29 1 time(s)
-F
フィールド区切り記号(FS
)をに設定します。ただし、小数点区切り記号()の前の項目を使用してすべての.
行を繰り返し、配列内のその項目が見つかった回数を記録します。{COUNTS[$1]++}
$1
.
COUNTS
最後に(END {}
)私たちが見つけたものをダンプします。ご覧のとおり、最大の部分は出力です。
ファイルから読みやすくなります。
{COUNTS[$1]++}
END {
for(ct in COUNTS)
{
printf("%d %d time(s)\n", ct, COUNTS[ct])
}
}
答え3
あなたが使用できるawk
:
awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile
出力をソートするには、出力を次にパイプしますsort
。
awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile | sort -k2
サンプル入力の場合、次のものが生成されます。
3 24
4 25
1 26
1 29
3 30
答え4
ファイルがすでにソートされているようです。
$ uniq -c <(perl -pe 's/\.\d*//' file)
3 30
1 29
1 26
4 25
3 24
まだソートされていない場合:
$ uniq -c <(perl -pe 's/\.\d*//' file | sort -rn)
3 30
1 29
1 26
4 25
3 24