Оболочка: подсчет строк на столбец при игнорировании пустых - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь просто посчитать строки в .CSV для каждого столбца, в то же время игнорируя пустые строки.

Я использую ниже, и это работает для 1-го столбца:

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

И ниже для 2-го столбца:

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

Но когда я пытаюсь сосчитать 3-й столбец, он просто выводит общее количество строк в целом .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 ]

2 голосов
/ 15 мая 2019

Это происходит, когда входной файл имеет окончания строки DOS (\r\n). Исправьте файл, используя dos2unix, и ваша команда будет работать и для 3-го столбца.

dos2unix /path/test.csv

Или вы можете удалить \r в конце при подсчете непустых столбцов с помощью awk:

awk -F, '{sub(/<b>\r</b>/,"")} $<b>3</b>!=""{n++} END{print n}' /path/test.csv
1 голос
/ 15 мая 2019

Проблема в команде grep: способ, которым вы написали, вернет 33 строки при подсчете 3-го столбца.

Вместо этого лучше использовать следующую команду для подсчета количества строк в .CSV для каждого столбца (пример ниже для 3-го столбца):

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

Это вернет точное количество строк для каждого столбца и позволит избежать попадания в wc. Смотрите предыдущий пост здесь: количество (непустых) строк кода в bash

1 голос
/ 15 мая 2019

edit: Я думаю, что oguz ismail нашел истинную причину в их ответе .Если они верны и в вашем файле есть окончания строк в Windows, вы можете использовать одну из следующих команд без необходимости конвертировать файл.

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

old answer: Поскольку я не могу воспроизвести вашу проблемус предоставленным вводом я делаю дикое предположение:

«Пустые» поля в последнем столбце содержат пробелы.Поле, содержащее пробел, не является пустым, хотя выглядит так, как будто оно пустое, поскольку вы не можете видеть пробелы.

Для подсчета только тех полей, которые содержат что-то отличное от пробела, адаптируйте свое регулярное выражение из . (любой символ) в[^ ] (любой символ, кроме пробела).

cut -d, -f3 yourFile.csv | grep -c '[^ ]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...