如何计算每行列数不均匀的csv文件中唯一字段的数量

How to count number of unique fields in a csv file with uneven number of columns in each row

我有一个 csv 文件,其中包含特定目录中文件的变量提取。因此每行的列数不同,如下所示:

filename1,variable1,variable2,variable3,variable4
filename2,variable1,variable2,variable5
filename3,variable1,variable5,variable6,variable7,variable8

(已删除尾随逗号)

命令:

awk -F ',' "{print NF}" < input.csv 

不要真的这样做,因为它只显示文件中所有行的 "largest" 行的列数。

如果我能得到每一行的变量数,更重要的是,能得到整个文件中唯一字段的数量,那就太好了。

第一个请求的理想输出类似于:

filename1   4
filename2   3
filename3   5

第二次请求的理想输出(整个文件中唯一字段的数量):

8

关于如何处理这个问题有什么好的想法吗?

谢谢,

祝你好运,Birgitte

您的两个要求可以一次完成:

awk -F, '{for(i=2;i<=NF;i++)a[$i]}{print , NF-1}
         END{print "total unique vars:"length(a)}' file.csv

将您的示例数据作为输入,我们得到:

filename1 4
filename2 3
filename3 5
total unique vars:8

如果要分成两个cmd:

awk -F, '{print , NF-1}' file.csv

awk -F, '{for(i=2;i<=NF;i++)a[$i]}END{print length(a)}' file.csv

这可能比单个 awk 脚本慢,但有替代方案总是好的:

整个文件中唯一变量的数量

$ cut -d, -f2- file | tr , \n | sort -u | wc -l
8

每行变量数

$ paste \
   <(cut -d, -f1 file) \
   <(grep -no , file | uniq -c | tr -s ' ' \t | cut -f2)
filename1   4
filename2   3
filename3   5