数据包含逗号时在bash中生成CSV文件

数据包含逗号时在bash中生成CSV文件,bash,Bash,我在bash中编写的脚本中遇到了问题。我在while循环中逐行读取.txt文件。该行的形式为x:y:z:a:b:c。每个元素('x','a'等)都对应于年龄、身高、姓名等。我已成功打印出所需字段,但当我尝试打印整个“x:y:z:a:b:c”时,“x:y:z”将在一个单元格中打印为.csv,“a:b:c”将转到下一个单元格,因为姓氏和名字中都有逗号。我知道这听起来令人困惑,因此我可以在必要时进一步澄清,但下面是它的样子: Cell 1 Cell 2

我在bash中编写的脚本中遇到了问题。我在while循环中逐行读取.txt文件。该行的形式为x:y:z:a:b:c。每个元素('x','a'等)都对应于年龄、身高、姓名等。我已成功打印出所需字段,但当我尝试打印整个“x:y:z:a:b:c”时,“x:y:z”将在一个单元格中打印为.csv,“a:b:c”将转到下一个单元格,因为姓氏和名字中都有逗号。我知道这听起来令人困惑,因此我可以在必要时进一步澄清,但下面是它的样子:

Cell 1                          Cell 2
age:height:number:last name     first name:language
while read INPUT do
    str=$INPUT
    IFS=: read -r -a ARR <<< "$str"
    NAME=${ARR[0]}
    AGE=${ARR[3]}
    echo $AGE, $NAME >>Filedirectory.filename.csv
done<filedirectory.filename.txt
我想把所有这些信息都放在一个牢房里。我认为问题是因为姓氏和名字之间有一个逗号。如果你有任何建议,请告诉我

编辑:代码如下所示:

Cell 1                          Cell 2
age:height:number:last name     first name:language
while read INPUT do
    str=$INPUT
    IFS=: read -r -a ARR <<< "$str"
    NAME=${ARR[0]}
    AGE=${ARR[3]}
    echo $AGE, $NAME >>Filedirectory.filename.csv
done<filedirectory.filename.txt
str=“史密斯,约翰:126磅:67英寸:26:学院大学”为例输入
所以,`NAME=Smith,John,AGE=26。理想情况下,输出应为两个相邻的单元格,填充为:

26 - Smith, John
相反,当我打开CSV文件时,excel中的输出结果是:

12 - Smith - John

如果每个“-”表示一列(
12
在一个单元格中,姓氏在下一个单元格中,等等),我希望姓氏和名字在一个单元格中,但显然这并没有发生,因为名称的格式为“Smith,John”,逗号把事情搞乱了

一个简单的实现可能如下所示:

while IFS=: read -r name _ age _; do
    printf '"%s","%s"\n' "${name//\"/\"\"}" "${age//\"/\"\"}"
done <in.txt >out.csv


在这两种情况下,我们都使用引号包围单元格内容,并使用a将字符串中的任何引号加倍,这使这些引号在CSV语法中成为文字。

您可以使用Excel功能:
当第一行是
SEP=:
时,csv文件将被用作SEP读取。
现在很容易:

sed -r ' s/([^:]*):([^:]*):([^:]*):([^:]*):.*/\4:\1/;
        1s/.*/SEP=:\n&/'    < filedirectory.filename.txt > outputfile;
sed-r的/([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):./\4:\1/;
1s/*/SEP=:\n&/'outputfile;

我发现这样做的一种方法是使用CSV感知工具,例如,它提供命令
csvformat

而IFS=:read-r name uuu年龄uuu;做
echo-e“${name}\t${age}”;
完成outputfile.csv

更改分隔符字符并打开电子表格,将分隔符设置为该字符?发布代码?不需要发布原始代码。我们需要的是一个——其他人可以运行的最短代码(即不依赖于您的本地环境)来复制问题。无论如何,如果在
IFS
中有逗号,bash只在逗号上拆分。如果没有将逗号定义为字段分隔符,则不会产生任何效果。并且,作为一般性建议,请确保您遵循逐行阅读内容的实践。对于您的问题,我们需要一个复制器来提供超出一般建议的内容。(顺便说一句,“cell”一词在本文中的含义尚不清楚;如果我们在问题中提供了代码、实际输出和预期输出,那么就不需要猜测了)。