加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:28:40 所属栏目:Linux 来源:网络整理
导读:我有很多列的巨大二进制矩阵,我试图在每个字段中为每个文件计算零和1,同时跟踪文件和标题.每个文件都有相同的标题和列数(但可变的行数),它是这样的: File 1:Header1 Header2 Header3 Header40 1 0 1 0 1 0 11 0 0 10 1 0 1File 2:Header1 Header2 Header3 H
我有很多列的巨大二进制矩阵,我试图在每个字段中为每个文件计算零和1,同时跟踪文件和标题.每个文件都有相同的标题和列数(但可变的行数),它是这样的:

File 1:
Header1 Header2 Header3 Header4
0 1 0 1 
0 1 0 1
1 0 0 1
0 1 0 1

File 2:
Header1 Header2 Header3 Header4
0 1 0 0 
0 0 0 0
0 0 0 1

计数为0/1的所需输出

Header1 Header2 Header3 Header4 Total
File1 1 3 0 4  4
File2 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("Filet");
    for(i=1;i<=length(h);i++){
      printf("%st",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%dn",f[file]);
    }
  }' file1 file2

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读