计算bashshell中每列的行数
我是Bash Shell的新手,在网上找不到有用的资源(也许有人可以给我推荐一些资源)。我正在处理一个csv文件,我想知道如何在没有空值的情况下获得每列的行数 我知道我们用这个代码来计算文件中的行数。但是如果我想指定一列呢计算bashshell中每列的行数,bash,unix,Bash,Unix,我是Bash Shell的新手,在网上找不到有用的资源(也许有人可以给我推荐一些资源)。我正在处理一个csv文件,我想知道如何在没有空值的情况下获得每列的行数 我知道我们用这个代码来计算文件中的行数。但是如果我想指定一列呢 cat文件名| wc-l 例如,我有下面的csv文件 ID Name ------------ 13 Sara 22 Suzan null Mark 49 John 我希望ID列的计数返回3 谢谢,在bash世界中,列是您创建的,通常是通过设置名为的
cat文件名| wc-l
例如,我有下面的csv文件
ID Name
------------
13 Sara
22 Suzan
null Mark
49 John
我希望ID列的计数返回3
谢谢,在bash世界中,列是您创建的,通常是通过设置名为
的字段分隔符(delimiter)
来创建的。生态系统有些混乱。通常,分隔符仅为单个字符,默认情况下通常为
(剪切
,粘贴
,…)。但是,例如sort
和awk
如果不手动设置,则使用一整段空格作为一个分隔符(但如果需要
,则只能设置一个字符,使用例如awk-F$'\t'
)
如果您的数据与您的问题中的数据相同(即它有固定宽度的列),则最好使用awk
,除非其中一列中有空字段(awk'{print$1}'
)。解析固定宽度格式的另一个选项是egcut-c1-4
(从每行打印字符1到4,这将是您的ID)
然后计算非空值。您希望首先跳过标题,即在您的示例中为tail-n+3
,并且您的“空”字段是字符串匹配,因此建议使用grep
(grep-v-c'null'
)
通过从后面删除管道(并添加头部
),可以逐个测试管道
您可以按照前面的建议使用grep
、cut
或awk
。其主要思想是计算列的空值,然后从行数中减去您计算的空值数,以找出没有空值的行数。基于所需输出的假设,您已经给出了
$ cat testfile
ID Name
------------
13 Sara
22 Suzan
null Mark
49 John
$ awk '$1 ~ /^[0-9]*$/{ count++ }END{print count}' testfile
3
$ awk 'function is_num(x){return(x==x+0);} is_num($1){ count++ }END{print count}' testfile
3
您可以使用awk
并在列不包含null
时递增一个计数器变量,然后在末尾打印变量。至于参考资料,我通过阅读全文学到了很多。一定不要错过上一章。谢谢,第一行很好用。我还添加了NR>1以跳过标题awk'NR>1&&$2~/[0-9]*$/{count++}END{print count}测试文件
不尝试解析列,只是为这种情况编写一个一次性解决方案,grep-c'^[0-9]'
就可以了。。。
$ cat testfile
ID Name
------------
13 Sara
22 Suzan
null Mark
49 John
$ awk '$1 ~ /^[0-9]*$/{ count++ }END{print count}' testfile
3
$ awk 'function is_num(x){return(x==x+0);} is_num($1){ count++ }END{print count}' testfile
3