[英]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.