Подсчет запятых в строке в bash

Иногда я получаю CSV файл, у которого есть возврат каретки внутри ячейки. Это не приемлемый формат для программы, которая будет использовать ее в качестве входных данных.

Чтобы определить, разделена ли строка ввода, я решил, что в плохой строке не будет ожидаемого количества запятых. Есть ли bash или другой общий инструмент командной строки unix, который позволит мне подсчитать запятые в строке? Если необходимо, я могу написать программу Python или Perl, но если это возможно, я бы хотел добавить строку или две к существующему bash script, чтобы вызвать сбой, если счет запятой неверен. Любые идеи?

Ответ 1

Сбросьте все, кроме запятых, а затем подсчитайте количество оставшихся символов:

$ echo foo,bar,baz | tr -cd , | wc -c
2

Ответ 2

Чтобы подсчитать количество раз, когда появляется запятая, вы можете использовать что-то вроде awk:

string=(line of input from CSV file)
echo "$string" | awk -F "," '{print NF-1}'

Но этого действительно недостаточно, чтобы определить, возвращается ли в нем поле каретки. Поля могут иметь запятые внутри, пока они окружены кавычками.

Ответ 3

В чистом Bash:

while IFS=, read -ra array
do
    echo "$((${#array[@]} - 1))"
done < inputfile

или

while read -r line
do
    count=${line//[^,]}
    echo "${#count}"
done < inputfile

Ответ 4

Попробуйте Perl:

$ perl -ne 'print [email protected]{[/,/g]},"\n"'
a
0
a,a
1
a,a,a,a,a
4

Ответ 5

В зависимости от того, что вы пытаетесь сделать с данными CSV, может быть полезно использовать обертку script, такую ​​как csvquote, чтобы временно заменить проблематичные строки новой строки (и запятые) внутри полей с кавычками, а затем восстановить их. Например:

csvquote inputfile.csv | wc -l

и

csvquote inputfile.csv | cut -d, -f1 | csvquote -u

может быть тем, что вы ищете. См. [https://github.com/dbro/csvquote][1] для кода и дополнительной информации

Ответ 6

Просто удалите все возвраты каретки:

tr -d "\r" old_file > new_file