我有一个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中。
答案 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