Shell:计算每列的行数,而忽略空的行数

时间:2019-05-15 12:05:47

标签: macos shell csv

我试图简单地计算每列.CSV中的行,而同时忽略空行。

我在下面使用,它适用于第一列:

cat /path/test.csv | cut -d, -f1 | grep . | wc -l` >> ~/Desktop/Output.csv
#Outputs:  8 

下面是第二列:

cat /path/test.csv | cut -d, -f2 | grep . | wc -l` >> ~/Desktop/Output.csv
#Outputs: 6

但是当我尝试计算第三列时,它只是输出整个.CSV中的总行数。

cat /path/test.csv | cut -d, -f3 | grep . | wc -l` >> ~/Desktop/Output.csv
    #Outputs: 33
    #Should be: 19?

我也尝试使用awk而不是cut,但是遇到了同样的问题。 我尝试创建新的file,以为可能行中有一些空格,但仍然相同。

有人可以说明有什么区别吗?贝特文读1-2栏,其余?

20355570_01.tif,,
20355570_02.tif,,
21377804_01.tif,,
21377804_02.tif,,
21404518_01.tif,,
21404518_02.tif,,
21404521_01.tif,,
21404521_02.tif,,
,22043764_01.tif,
,22043764_02.tif,
,22095060_01.tif,
,22095060_02.tif,
,23507574_01.tif,
,23507574_02.tif,
,,23507574_03.tif
,,23507804_01.tif
,,23507804_02.tif
,,23507804_03.tif
,,23509247_01.tif
,,23509247_02.tif
,,23509247_03.tif
,,23527663_01.tif
,,23527663_02.tif
,,23527663_03.tif
,,23527908_01.tif
,,23527908_02.tif
,,23527908_03.tif
,,23535506_01.tif
,,23535506_02.tif
,,23535562_01.tif
,,23535562_02.tif
,,23535636_01.tif
,,23535636_02.tif

csv in spreadsheet software

3 个答案:

答案 0 :(得分:2)

当输入文件具有DOS行尾(\r\n)时,会发生这种情况。使用dos2unix修复文件,您的命令也将适用于第三列。

dos2unix /path/test.csv

或者,您可以在使用awk计算非空列的同时最后删除\r

awk -F, '{sub(/\r/,"")} $3!=""{n++} END{print n}' /path/test.csv

答案 1 :(得分:1)

编辑:我认为oguz ismail在their answer中找到了实际原因。如果它们正确,并且文件具有Windows行尾,则可以使用以下命令之一,而不必转换文件。

cut -d, -f3 yourFile.csv cut | tr -d \\r | grep -c .
cut -d, -f3 yourFile.csv | grep -c $'[^\r]' # bash only

旧答案:由于无法使用提供的输入来重现您的问题,因此我大胆猜测:

最后一列中的“空”字段包含空格。包含空格的字段虽然不是空的,但看起来好像是空的,因为您看不到空格。

要仅计算包含空格以外的字段,请将您的正则表达式从.(任何符号)更改为[^ ](空格以外的任何符号)。

cut -d, -f3 yourFile.csv | grep -c '[^ ]'

答案 2 :(得分:1)

问题出在grep命令中:计算第三列时,您编写它的方式将返回33行。

最好使用以下命令为每一列计算.CSV中的行数(以下示例针对第三列):

cat /path/test.csv | cut -d , -f3 | grep -cve '^\s*$'

这将返回每列的确切行数,并避免将管道输送到wc中。 在这里查看以前的帖子: count (non-blank) lines-of-code in bash