我正在编写一个读取csv文件并打印读取值的shell脚本:
#!/bin/bash
#echo"Starting execution in script"
exec < src/main/resources/test1.csv || exit 1
read header # read (and ignore) the first line
while IFS=, read name age salary ; do
echo "{"\"name"\":"\"${name}"\","\"age"\":${age},"\"salary"\":${salary}}"
done
test1.csv(输入文件):
name,age,salary
Subhash,26.0,10000.0
Amit,25.0,20000.0
Rohit,28.0,3000.0
Manoranjan,20.0,50000.0
在运行脚本时,我通过以下方式获取输出:
}"name":"Subhash","age":26.0,"salary":10000.0
}"name":"Amit","age":25.0,"salary":20000.0
}"name":"Rohit","age":28.0,"salary":3000.0
}"name":"Manoranjan","age":20.0,"salary":50000.0
但是,如果我尝试在终端上从上述脚本运行相同的回显行,则使用括号将得到正确的输出:
{"name": "subhash","age":23,"salary":1000}
上面的脚本怎么了?
答案 0 :(得分:3)
问题是您的test1.csv包含“ windows” \r\n
行返回。
将\r
读取为最后一个变量的一部分,然后在后大括号上打印以下字符(}
)-echo正在完成其工作。
我不确定为什么交互式地执行此操作(您是否以相同的方式读取变量?),但是您只需要清理输入文件,或者使用例如,从最后一个变量的末尾删除它。 ${salary%$'\r'}
(作为一个补充说明,您无需退出报价单即可打印转义的报价单,因此您的回显可能如下所示:
echo "{\"name\":\"${name}\",\"age\":${age},\"salary\":${salary%$'\r'}}"
)
答案 1 :(得分:2)
我稍微修改了你的剧本;删除了exec
和read header
。相反,我选择了sed
来切断标题行,而选择了akw
来删除尾随空格(来自test1.csv文件)。这项工作对我来说很好:
while IFS=, read name age salary; do
echo "{"\"name"\":"\"${name}"\","\"age"\":${age},"\"salary"\":${salary}}"
done < <(sed 1d src/main/resources/test1.csv | awk '{$1=$1};1')