ファイル内の数値をグループ化する方法

ファイル内の数値をグループ化する方法

浮動小数点形式の数値を含むファイルがあります。 「グループ化」して見ることが
できます。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

そしてawkmawk):

$ 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

関連情報