是否可以计算文件每一列中的行数?例如,我一直试图使用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
答案 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
。