【问题标题】:How to create csv file using shell script如何使用 shell 脚本创建 csv 文件
【发布时间】:2016-10-21 11:45:04
【问题描述】:

我目前的输出是:

echo "Time Taken to checkout svn repository repo_performance hosted on $host on `date` is : $Time_checkout seconds" >> log.csv
    echo "Time Taken to add $loopmax 10MB svn files in svn repository repo_performance  hosted on $host `date` is : $Time_add seconds" >> log.csv
    echo "Time Taken to commit $loopmax 10MB svn files in svn repository repo_performance  hosted on $host on `date` is : $Time_commit seconds" >> log.csv

但是,我想创建一个 csv 文件,其中包含主机、日期、操作、持续时间及其行中的值。

如何使用脚本来实现?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    你可以这样做:

    echo "$host, `date`, checkout,$Time_checkout" >> log.csv
    echo "$host, `date`, add, $Time_add" >> log.csv
    echo "$host, `date`, cimmit, $Time_commits" >> log.csv
    

    【讨论】:

    • 没关系。但是如何将我的 csv 文件头创建为主机、日期、操作、持续时间
    【解决方案2】:

    你可以试试这样的;

    printf "Host\tDate\tOperation\tDuration\n" >> log.csv
    printf "$host\t$(date)\tTime Taken to checkout\t$Time_checkout\n" >> log.csv
    printf "$host\t$(date)\tTime Taken to add $loopmax 10MB svn files\t$Time_add\n" >> log.csv
    printf "$host\t$(date)\tTime Taken to commit $loopmax 10MB svn files\t$Time_commit\n" >> log.csv
    

    【讨论】:

    • printf 似乎比echo -e@Mustafa DOGRU 更好
    【解决方案3】:

    您还可以推广 Mig82 的 answer 以支持 variable 参数,如下所示:

    # Usage: csv <items>
    
    csv()
    {
        local items=("$@")
    
        (
        IFS=,
        echo "${items[*]}"
        )
    }
    
    csv 1 "2 3" >> log.csv
    

    【讨论】:

    • 使用这个稍加调整来处理引用:``` csv() { local items=("$@") # 根据需要引用和转义 # datatracker.ietf.org/doc/html/rfc4180 for i in "${ !items[@]}" do if [[ "${items[$i]}" =~ [,\"] ]] then items[$i]=\"$(echo -n "${items[$ i]}" | sed s/\"/\"\"/g)\" fi 完成(IFS=, echo "${items[*]}" ) } ```
    【解决方案4】:

    以防万一有人在寻找值在双引号 (") 中的 CSV,您必须删除 echo 的外引号并将它们(转义)用于每个值,如下所示:

    echo \"$host\",\"$date",\"checkout\",\"$checkout_time\" >> log.csv
    echo \"$host\",\"$date",\"add\",\"$add_time\" >> log.csv
    echo \"$host\",\"$date",\"commit\",\"$commit_time\" >> log.csv
    

    我建议您编写一个函数来使您的脚本不那么冗长且更易于阅读,就像这样。

    write_csv(){
        echo \"$1\",\"$2\",\"$3\",\"$4\" >> log.csv
    }
    write_csv $host $date checkout $checkout_time
    write_csv $host $date add $add_time
    write_csv $host $date commit $commit_time
    

    【讨论】:

      【解决方案5】:

      使用@Nishant 的答案稍作调整来处理引用:

          csv()
          {
              local items=("$@")
          
              # quote and escape as needed
              # https://datatracker.ietf.org/doc/html/rfc4180
              for i in "${!items[@]}"
              do
                  if [[ "${items[$i]}" =~ [,\"] ]]
                  then
                      items[$i]=\"$(echo -n "${items[$i]}" | sed s/\"/\"\"/g)\"
                  fi
              done
          
              (
              IFS=,
              echo "${items[*]}"
              )
          }
      

      【讨论】: