2016-05-07 21 views
3

我有一个xmlstarlet命令看起来像这样:添加一个换行符以CSV内CONCAT()

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行转换为列。

+1

@shellter谢谢 – buzzin

回答

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 

将做的工作适合你。

1

那么,您的concat语句显式连接名称和值。看起来你想要做的是循环两次元素,首先选择名称,然后选择值。

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