Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算bashshell中每列的行数_Bash_Unix - Fatal编程技术网

计算bashshell中每列的行数

计算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世界中,列是您创建的,通常是通过设置名为的

我是Bash Shell的新手,在网上找不到有用的资源(也许有人可以给我推荐一些资源)。我正在处理一个csv文件,我想知道如何在没有空值的情况下获得每列的行数

我知道我们用这个代码来计算文件中的行数。但是如果我想指定一列呢

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}'
)。解析固定宽度格式的另一个选项是eg
cut-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