将数组的元素追加到行的末尾

时间:2014-09-20 20:50:00

标签: arrays bash loops sed

首先让我说我在stackoverflow.com上关注了与我的问题有关的问题,似乎规则没有适用。让我告诉你。

以下脚本:

    #!/bin/bash
    OUTPUT_DIR=/share/es-ops/Build_Farm_Reports/WorkSpace_Reports
    TODAY=`date +"%m-%d-%y"`
    HOSTNAME=`hostname`
    WORKSPACES=( "bob" "mel" "sideshow-ws2" )
    if ! [ -f $OUTPUT_DIR/$HOSTNAME.csv ] && [ $HOSTNAME == "sideshow" ]; then
    echo "$TODAY","$HOSTNAME" >  $OUTPUT_DIR/$HOSTNAME.csv
    echo "${WORKSPACES[0]}," >> $OUTPUT_DIR/$HOSTNAME.csv
    sed -i "/^'"${WORKSPACES[0]}"'/$/'"${WORKSPACES[1]}"'/" $OUTPUT_DIR/$HOSTNAME.csv
    sed -i "/^'"${WORKSPACES[1]}"'/$/${WORKSPACES[2]}"'/" $OUTPUT_DIR/$HOSTNAME.csv
    fi

我希望输出看起来像:

09-20-14,sideshow
bob,mel,sideshow-ws2

sed语句应该将连续的数组元素追加到同一行的前一个数组元素。现在我知道有一种更简单的方法可以做到这一点:

echo "${WORKSPACES[0]},${WORKSPACES[1]},${WORKSPACES[2]}" >> $OUTPUT_DIR/$HOSTNAME.csv

但是,假设我在数组中有30个元素,我想在同一行上一个接一个地附加它们?你能告诉我如何遍历数组中的元素并将它们一个接一个地附加在同一行上吗?

另外,假设我输出了如下命令:

df -m /export/ws/$ws | awk '{if (NR!=1) {print $3}}'

我希望将其附加到同一行的末尾。

但是当我跑步时,我得到了:

    + OUTPUT_DIR=/share/es-ops/Build_Farm_Reports/WorkSpace_Reports
    ++ date +%m-%d-%y
    + TODAY=09-20-14
    ++ hostname
    + HOSTNAME=sideshow
    + WORKSPACES=("bob" "mel" "sideshow-ws2")
    + '[' -f /share/es-ops/Build_Farm_Reports/WorkSpace_Reports/sideshow.csv ']'

现在文件看起来像:

09-20-14,sideshow
bob,

我很高兴地报告用户syme解决了这个(see below),但后来我发现我需要第一栏中的日期:

09-7-14,bob,mel,sideshow-ws2

我可以使用syme's进行循环吗?

好的用户syme也解决了这个问题,他说"Just add $TODAY to the for loop"就像这样:

for v in "$TODAY" "${WORKSPACES[@]}"

好了,现在输出看起来像I changed the elements in the array btw

sideshow
09-20-14,bob_avail,bob_used,mel_avail,mel_used,sideshow-ws2_avail,sideshow-ws2_used

现在低于下一行,第一列中的,将填充日期,然后填充:

df -m /export/ws/$v | awk '{if (NR!=1) {print $3}}

等于第一次迭代中bob上可用空间的值

然后:

df -m /export/ws/$v | awk '{if (NR!=1) {print $2}}

等于第二次迭代中bob上已用空间的值

然后我们转到${WORKSPACE[@]}

中的下一个值

这将是mel并且可以使用和我们使用bob或上面的$v一样使用。

我知道你们这里的天才会让孩子玩得更好。

我在这个帖子上解决了自己的最后一个问题:

    WORKSPACES2=( "bob" "mel" "sideshow-ws2" )
    separator="," # defined empty for the first value
    for v in "${WORKSPACES2[@]}"
    do
    available=`df -m /export/ws/$v | awk '{if (NR!=1) {print $3}}'`
    used=`df -m /export/ws/$v | awk '{if (NR!=1) {print $2}}'`
      echo -n "$separator$available$separator$used" >> $OUTPUT_DIR/$HOSTNAME.csv # append, concatenated, the separator and the value to the file
    done

产生

sideshow
09-20-14,bob_avail,bob_used,mel_avail,mel_used,sideshow-ws2_avail,sideshow-ws2_used
,470400,1032124,661826,1032124,43443,1032108

1 个答案:

答案 0 :(得分:1)

echo -n允许在没有换行符的情况下打印文本。

要循环遍历数组的值,可以使用for循环:

echo "$TODAY,$HOSTNAME" >  $OUTPUT_DIR/$HOSTNAME.csv # with a linebreak
separator="" # defined empty for the first value
for v in "${WORKSPACES[@]}"
do
  echo -n "$separator$v" >> $OUTPUT_DIR/$HOSTNAME.csv # append, concatenated, the separator and the value to the file
  separator="," # comma for the next values
done
echo >> $OUTPUT_DIR/$HOSTNAME.csv # add a linebreak (if you want it)