ファイルの各列で特定の数の発生回数を計算する方法は?

ファイルの各列で特定の数の発生回数を計算する方法は?

負のリストを含むtxtファイルと3つの数値列を含むcsvファイルがあります。 csvファイル内のすべての数字はtxtファイルに含まれ、txtファイルにはcsvファイル内の数字のみが含まれます。

以下は簡単な例です。

cat list.txt
-14.5
-12.3
-10.1
-10.0
-9.9
-9.8
-7.3
-0.1

cat numbers.csv
-14.5,-14.5,-12.3
-14.5,-12.3,-10.1
-10.0,-9.9,-10.1
-7.3,-9.8,-10.1
-7.3,-7.3,-10.1
-0.1,-0.1,-9.8

list.txt各列に各数字が何回表示されるかを知る必要がありますnumbers.csv

上記の例で予想される結果は次のとおりです。

-14.5: 2,1,0
-12.3: 0,1,1
-10.1: 0,0,4
-10.0: 1,0,0
-9.9: 0,1,0
-9.8: 0,1,1
-7.3: 2,1,0
-0.1: 1,1,0

見つけることができるショートカットがありますか?私はbashとpythonの初心者です。

ベストアンサー1

  1. 最初のファイルを配列として読み込みます。
  2. 各行について:各列をすべての数値配列メンバーと比較し、一致する項目ごとに数配列項目を増やします。
  3. すべての行が処理された後: 列数とともに数値配列のすべてのメンバーを印刷します。
$ awk -F, 'NR==FNR { n[NR]=$1; count=NR; next; }; '\
'{ for(i=1;i<=count;i++) { number=n[i]; '\
'  if (number==$1) c[number,1]++; '\
'  if (number==$2) c[number,2]++; '\
'  if (number==$3) c[number,3]++;  } }; '\
'END { for(i=1;i<=count;i++) { number=n[i]; text=number ": "; '\
'for(col=1;col<4;col++) { if (c[number,col]=="") c[number,col]=0; if (col>1) text=text ","; '\
'text=text c[number,col];} print text; }; }' list.txt numbers.csv 

-14.5: 2,1,0
-12.3: 0,1,1
-10.1: 0,0,4
-10.0: 1,0,0
-9.9: 0,1,0
-9.8: 0,1,1
-7.3: 2,1,0
-0.1: 1,1,0

おすすめ記事