ein*_*ica 2 csv bash shell counting multiple-columns
我有一个格式正确的CSV文件,可能有也可能没有标题行; 并且可能有也可能没有引用数据.我想使用shell确定其中的列数.
现在,如果我可以确定文件中没有带引号的逗号,则以下内容似乎有效:
x=$(tail -1 00-45-19-tester-trace.csv | grep -o , | wc -l); echo $((x + 1))
Run Code Online (Sandbox Code Playgroud)
但如果我不能做出这样的假设呢?也就是说,如果我不能假设逗号总是一个字段分隔符怎么办?那我该怎么办?
如果它有帮助,你可以假设没有引用的引号(即\"在引用的字符串之间的s); 但最好不要制作那个.
如果你不能对数据做出任何乐观的假设,那么在Bash中就不会有一个简单的解决方案.使用可能的嵌入式换行符和嵌入式分隔符解析通用CSV格式并非易事.你最好不要在bash中编写它,而是使用现有的适当的CSV解析.例如,Python在其标准库中内置了一个.
如果你可以假设没有嵌入的换行符和嵌入的分隔符,那么用逗号分割逗号很简单:
awk -F, '{ print NF; exit }' input.csv
Run Code Online (Sandbox Code Playgroud)
-F,告诉awk使用逗号作为字段分隔符,自动NF变量是当前行上的字段数.
如果你想允许嵌入式分隔符,但是你可以假设没有嵌入的双引号,那么你可以使用简单的过滤器来消除嵌入式分隔符,然后再切换到与之前相同的awk:
head -n 1 input.csv | sed -e 's/"[^"]*"//g' | awk ...
Run Code Online (Sandbox Code Playgroud)
请注意,这两个示例都使用第一行来确定字段数.如果输入有一个标题行,这应该很好,因为标题不应包含嵌入的换行符