我在使用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
...其中filedirectory.filename.txt
包含以下内容:
INPUT=Smith, John:126 lbs:67in:26:College University
输入str = "Smith, John:126 lbs:67in:26:College University"
的示例输入
所以,`NAME = Smith,John,AGE = 26.理想情况下,输出应该是彼此相邻的2个单元格,填充为:
26 - Smith, John
而不是我打开CSV文件时excel中的输出最终是:
12 - Smith - John
其中每个' - '表示一列(12
在一个单元格中,姓氏在下一个单元格中等等。)我想要的是姓氏和名字在一个单元格中,但显然这个由于名称被格式化为“史密斯,约翰”并且逗号搞乱了这一事实,因此没有发生
答案 0 :(得分:1)
一个简单的实现可能如下所示:
while IFS=: read -r name _ age _; do
printf '"%s","%s"\n' "${name//\"/\"\"}" "${age//\"/\"\"}"
done <in.txt >out.csv
Less correctly(请参阅描述警告的链接规范的APPLICATION USAGE和RATIONALE部分),您可以使用echo
执行此操作:
while IFS=: read -r name _ age _; do
echo '"'"${name//\"/\"\"}"'","'"${age//\"/\"\"}"'"'
done <in.txt >out.csv
在这两种情况下,我们都使用引号包围单元格内容,并使用parameter expansion来加倍在字符串中找到的任何引号,这使得这些引号以CSV语法显示。
答案 1 :(得分:0)
您可以使用Excel功能:
当第一行为SEP=:
时,将使用此作为SEP读取csv文件
现在很简单:
sed -r ' s/([^:]*):([^:]*):([^:]*):([^:]*):.*/\4:\1/;
1s/.*/SEP=:\n&/' < filedirectory.filename.txt > outputfile;
答案 2 :(得分:0)
我发现要这样做的一种方法是使用CSV感知工具,例如csvkit
,它提供命令csvformat
:
while IFS=: read -r name _ age _; do
echo -e "${name}\t${age}";
done < filedirectory.filename.txt | csvformat -t > outputfile.csv