Ответ 1
Сбросьте все, кроме запятых, а затем подсчитайте количество оставшихся символов:
$ echo foo,bar,baz | tr -cd , | wc -c
2
Иногда я получаю CSV файл, у которого есть возврат каретки внутри ячейки. Это не приемлемый формат для программы, которая будет использовать ее в качестве входных данных.
Чтобы определить, разделена ли строка ввода, я решил, что в плохой строке не будет ожидаемого количества запятых. Есть ли bash или другой общий инструмент командной строки unix, который позволит мне подсчитать запятые в строке? Если необходимо, я могу написать программу Python или Perl, но если это возможно, я бы хотел добавить строку или две к существующему bash script, чтобы вызвать сбой, если счет запятой неверен. Любые идеи?
Сбросьте все, кроме запятых, а затем подсчитайте количество оставшихся символов:
$ echo foo,bar,baz | tr -cd , | wc -c
2
Чтобы подсчитать количество раз, когда появляется запятая, вы можете использовать что-то вроде awk:
string=(line of input from CSV file)
echo "$string" | awk -F "," '{print NF-1}'
Но этого действительно недостаточно, чтобы определить, возвращается ли в нем поле каретки. Поля могут иметь запятые внутри, пока они окружены кавычками.
В чистом Bash:
while IFS=, read -ra array
do
echo "$((${#array[@]} - 1))"
done < inputfile
или
while read -r line
do
count=${line//[^,]}
echo "${#count}"
done < inputfile
Попробуйте Perl:
$ perl -ne 'print [email protected]{[/,/g]},"\n"'
a
0
a,a
1
a,a,a,a,a
4
В зависимости от того, что вы пытаетесь сделать с данными CSV, может быть полезно использовать обертку script, такую как csvquote, чтобы временно заменить проблематичные строки новой строки (и запятые) внутри полей с кавычками, а затем восстановить их. Например:
csvquote inputfile.csv | wc -l
и
csvquote inputfile.csv | cut -d, -f1 | csvquote -u
может быть тем, что вы ищете. См. [https://github.com/dbro/csvquote][1]
для кода и дополнительной информации
Просто удалите все возвраты каретки:
tr -d "\r" old_file > new_file