【问题标题】:Adding a linebreak in csv inside concat()在 concat() 内的 csv 中添加换行符
【发布时间】:2016-09-02 04:33:13
【问题描述】:

我有一个看起来像这样的 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 行转换为列的宏。

【问题讨论】:

    标签: linux bash csv unix xmlstarlet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您无法使用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
      

      将为您完成工作。

      【讨论】:

        【解决方案3】:

        你可以在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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多