在concat()中的csv中添加换行符

时间:2016-05-07 01:37:30

标签: linux bash csv unix xmlstarlet

我有一个xmlstarlet命令,如下所示:

xml sel -T-t -m /xml/path -v "concat(name,','value,',')" -n filename.xml > output.csv

输出如此

#output.csv
name,value,
name,value,
name,value,

我希望它看起来像

name,name,name,
value,value,value,

我一直专注于在concat中尝试不同的组合:

"concat(name,'<p>'value,',')"
"concat(name,'<br />'value,',')"
"concat(name,'"<p>"'value,',')"
"concat(name,'\n'value,',')"

我是否在看完全错误的区域?

我最终采用的路线是使用一个将8行转换成列的宏,在excel中。

3 个答案:

答案 0 :(得分:1)

好吧,您的concat语句明确地连接了名称和值。看起来你要做的就是循环遍历元素两次,首先选择名称然后选择值。

答案 1 :(得分:0)

如果您无法使用xml格式化输出,请在脚本下方

awk 'BEGIN{FS=","}
NR==FNR{if(NR!=1){array[$1]=$2;next}}
END{
for (key in array) {printf "%s,",key;valuelist=valuelist""array[key]","}
{printf "\n";print valuelist}
}' your_file_name  > temp.txt && mv temp.txt your_file_name

将为您完成工作。

答案 2 :(得分:0)

您可以在xml命令之后处理数据:

unset allnames allvalues
while IFS=, read -r name value; do
   allnames+="${name},"
   allvalues+="${value},"
done < <(echo "name1,value1
name2,value2,
name3,value3" )

echo "${allnames}"
echo "${allvalues}"

你无法通过while循环传递它(循环中设置的变量会丢失),所以你可以像你这样使用命令:

unset allnames allvalues
while IFS=, read -r name value; do
   allnames+="${name},"
   allvalues+="${value},"
done < <(xml sel -T-t -m /xml/path -v "concat(name,','value,',')" -n filename.xml  )

echo "${allnames}" >  output.csv
echo "${allvalues}">> output.csv