在bash中用逗号计算逗号

时间:2012-05-30 13:35:51

标签: bash shell

有时我会收到一个CSV文件,它在单元格内有一个回车符。对于将其用作输入的程序,这不是可接受的格式。

为了检测输入行是否被拆分,我确定坏行不会有预期的逗号数。是否有bash或其他常见的unix命令行工具,可以让我计算行中的逗号?如果有必要,我可以编写一个Python或Perl程序来执行此操作,但是如果可能的话,我想在现有的bash脚本中添加一行或两行,如果逗号计数错误则导致它失败。有什么想法吗?

7 个答案:

答案 0 :(得分:34)

除了逗号之外的所有内容,然后计算剩下的字符数:

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

答案 1 :(得分:5)

要计算逗号出现的次数,您可以使用类似awk:

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

但这确实不足以确定某个字段是否有回车符。只要字段被引号括起来,字段就可以包含逗号。

答案 2 :(得分:4)

纯粹的Bash:

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

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

答案 3 :(得分:2)

尝试Perl:

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

答案 4 :(得分:0)

根据您尝试对CSV数据执行的操作,使用csvquote等包装脚本暂时替换引用字段中有问题的换行符(和逗号),然后还原它们可能会有所帮助。例如:

csvquote inputfile.csv | wc -l

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

可能是你正在寻找的东西。有关代码和更多信息,请参阅[https://github.com/dbro/csvquote][1]

答案 5 :(得分:0)

对我来说,比其他解决方案更好的是这个。如果test.txt具有:

foo,bar,baz
baz,foo,foobar,bar

然后cat test.txt | xargs -I % sh -c 'echo % | tr -cd , | wc -c'产生

2
3

这对于流源,拖尾日志等非常有效。

答案 6 :(得分:-2)

只需删除所有回车符:

tr -d "\r" old_file > new_file