我试图简单地计算每列.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
答案 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