我正在研究一个很长的Bash脚本.我想将CSV文件中的单元格读入Bash变量.我可以解析行和第一列,但不能解析任何其他列.到目前为止,这是我的代码:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Run Code Online (Sandbox Code Playgroud)
它只打印第一列.作为额外的测试,我尝试了以下内容:
read -d, x y < <(echo a,b,)
并且$ y是空的.所以我尝试过:
read x y < <(echo a b)
$ y是b.为什么?
如果我有一个csv文件,是否有快速bash方式打印出任何单个列的内容?可以安全地假设每行具有相同的列数,但每列的内容将具有不同的长度.
这个问题的目的是提供一个规范的答案.
给定可能由Excel或其他具有嵌入换行符的工具生成的CSV,嵌入式双引号和空字段,如:
$ cat file.csv
"rec1, fld1",,"rec1"",""fld3.1
"",
fld3.2","rec1
fld4"
"rec2, fld1.1
fld1.2","rec2 fld2.1""fld2.2""fld2.3","",rec2 fld4
Run Code Online (Sandbox Code Playgroud)
使用awk识别单独记录和字段的最有效方法是什么:
Record 1:
$1=<rec1, fld1>
$2=<>
$3=<rec1","fld3.1
",
fld3.2>
$4=<rec1
fld4>
----
Record 2:
$1=<rec2, fld1.1
fld1.2>
$2=<rec2 fld2.1"fld2.2"fld2.3>
$3=<>
$4=<rec2 fld4>
----
Run Code Online (Sandbox Code Playgroud)
所以它可以在awk脚本的其余部分内部用作那些记录和字段.
有效的CSV将符合RFC 4180或可由MS-Excel生成.
解决方案必须允许记录结束只是LF(\n),这是UNIX文件的典型情况,而不是CRLF(\r\n),正如标准所要求的那样,Excel或其他Windows工具会生成.它还可以容忍与引用字段混合的未加引号的字段.它特别不需要容忍"使用前面的反斜杠转义s(即\"代替""),因为其他一些CSV格式允许 - 如果你有,那么添加一个gsub(/\\"/,"\"\"")前端将处理它并尝试在一个脚本中自动处理两个转义机制将使脚本不必要地脆弱和复杂.
嗨需要一个shell脚本来解析csv文件 - 逐行,然后逐字段解析]
该文件将如下所示
X1,X2,X3,X4
Y1,Y2,Y3,Y4
Run Code Online (Sandbox Code Playgroud)
我需要提取这些X1,X2 ....
我写了一个脚本,但如果该行超过一行则失败.
如何"从文件中删除新行?
例如:
"one",
"three
four",
"seven"
Run Code Online (Sandbox Code Playgroud)
所以,我想删除\n之间three和four.我应该使用正则表达式,还是我必须使用程序读取每个字符的文件?