计算每列中的行数

时间:2018-07-16 11:40:38

标签: awk printing wc

是否可以计算文件每一列中的行数?例如,我一直试图使用awk来分隔分号上的列,分别指定每个列,并使用wc命令来计算该列中的所有事件。
对于以下命令,我尝试在不计算空白行的情况下在第3列中查找项目数。不幸的是,此命令仅计算整个文件。我可以将列移到另一个文件中并对该文件进行计数,但是我只想知道是否有更快的方法来解决这个问题?

awk -F ';' '{print $3}' file.txt | wc -l

数据文件格式

; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ;  
; 3 ; 4 ; 5 ; 6 ;   ; 4 ;  
;   ; 3 ; 5 ; 6 ; 9 ; 8 ;  
; 1 ; 6 ; 3 ;   ;   ; 4 ;  
; 2 ; 3 ;   ; 3 ;   ; 5 ;  

想要示例输出

Column 1 = 4 aka(1 + 3 + 1 + 2)  
Column 2 = 5  
Column 3 = 4  
Colunm 4 = 4  
Column 5 = 2  
Column 6 = 5 

1 个答案:

答案 0 :(得分:4)

使用数组为每个字段保留单独的计数,然后在完成后打印总计:

$ awk -F' *; *' '{ for (i = 2; i < NF; ++i) if ($i != "") ++count[i] } 
  END { for (i = 2; i < NF; ++i) print "Column", i-1, "=", count[i] }' file
Column 1 = 4
Column 2 = 5
Column 3 = 4
Column 4 = 4
Column 5 = 2
Column 6 = 5
  • 设置字段分隔符以使用分号以及所有周围的空格。
  • 遍历每个字段(第一个和最后一个除外,它们始终为空),并为非空字段递增计数器。
    • 使用if ($i)很诱人,但这对于包含0的列将失败。
  • END块中打印计数,向-1偏移1而不是2

这里做出的一个假设是,整个文件中每一行的列数是一致的,因此可以安全地在NF块中使用最后一行的END


使用更简单的字段分隔符进行细微改动:

$ awk -F';' '{ for (i = 2; i < NF; ++i) count[i] += ($i ~ /[^ ]/) } 
  END { for (i = 2; i < NF; ++i) print "Column", i-1, "=", count[i] }' file
如果在第$i ~ /[^ ]/字段中存在任何非空格字符,则

1等于i,否则为0