我有一个包含负数列表的 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
- 将第一个文件读入数组。
- 对于每一行:将每一列与所有数字数组成员进行比较,并为每个匹配增加计数数组条目。
- 处理完所有行后:打印数字数组的所有成员以及列计数。
$ 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