linux – 打印许多文件中每列的唯一值计数

linux – 打印许多文件中每列的唯一值计数,第1张

概述我有很多列的巨大二进制矩阵,我试图在每个字段中为每个文件计算零和1,同时跟踪文件和标题.每个文件都有相同的标题和列数(但可变的行数),它是这样的: File 1:Header1 Header2 Header3 Header40 1 0 1 0 1 0 11 0 0 10 1 0 1File 2:Header1 Header2 Header3 Header40 1 0 0 0 0 我有很多列的巨大二进制矩阵,我试图在每个字段中为每个文件计算零和1,同时跟踪文件和标题.每个文件都有相同的标题和列数(但可变的行数),它是这样的:

file 1:header1 header2 header3 header40 1 0 1 0 1 0 11 0 0 10 1 0 1file 2:header1 header2 header3 header40 1 0 0 0 0 0 00 0 0 1

计数为0/1的所需输出

header1 header2 header3 header4 Totalfile1 1 3 0 4  4file2 0 1 0 1  3

现在我有一个值等于仅为file1的值的计数,但是每个行都作为标题出现,而我希望原始标题保留为标题,如果没有标题,则不会打印0 …它不包含原始文件名,因此总体上不对!你能指导我做正确的方法吗?

awk 'NF>0{  for (i=1; i<=NF; i++)       if(NR==1)h[i]=$i;else if($i==1) a[i]++;  } END{for(i=1; i<=length(a); i++) print h[i],a[i],NR}' file1
解决方法 以下似乎对我有用:

awk '  # Gather headers,only from the first line of the first file.  NR==1{    for(i=1;i<=NF;i++){      h[i]=$i;    }  }  # Do not process header as if they were data.  FNR==1{ next; }  NF>limit{ limit=NF; }  # Step through data   {    f[filename]++;    for(i=1;i<=NF;i++){      a[filename,i]+=$i;    }  }  # display what we found.  END{    # headers...    printf("file\t");    for(i=1;i<=length(h);i++){      printf("%s\t",h[i])    }    print "Total";    # And data.    for(file in f){      printf("%s",file);      for(i=1;i<=limit;i++){        printf("\t%d",a[file,i])      }      printf("\t%d\n",f[file]);    }  }' file1 file2

请注意,我们为文件名保留了一个数组f [],因为awk并不真正支持多维数组.上面的脚本应该适用于任何旧的awk. (我在FreeBSD中对它进行了测试.)虽然如果处理数百万个文件可能会遇到问题,因为数组使用非零内存量.另一方面,文件数也受shell命令行长度的限制. 总结

以上是内存溢出为你收集整理的linux – 打印许多文件中每列的唯一值计数全部内容,希望文章能够帮你解决linux – 打印许多文件中每列的唯一值计数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1028107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存