繁体   English   中英

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

[英]Append elements of an array to the end of a line

首先让我说我关注了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 for循环吗?

好的,用户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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM