我有一个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,',')"
我看错地方了吗?
我最终采用的方法是在excel中使用一个将8行转换为列的宏。
好吧,concat
语句显式连接名称和值。您想要做的似乎是在元素上循环两次,首先选择名称,然后选择值。
如果您不能使用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
将为你做这项工作。
您可以在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