2014-09-20 2 views
0

Сначала позвольте мне сказать, что я следил за вопросами на 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 

СЕПГ заявления должны приложить последовательные элементы массива в предыдущих на одной и той же линии. Теперь я знаю, что есть более простой способ сделать это, как:

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}} 

, которая равна значению свободного пространства на боб в первой итерации

, а затем:

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

, которая равна стоимости используемого пространства на боб во 2-й итерации

, а затем мы просто перейдите к следующему значению в ${WORKSPACE[@]}

, который будет использоваться и использоваться как мы сделали с 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,8 
+0

Спинка-тик на 2 строки с 'sed' не закрыты. Но я не думаю, что это твоя проблема. Я просто не понимаю, что вы пытаетесь сделать с этими двумя строками: 1. 'sed -i' изменяет указанный файл, не ожидается вывод (для печати' echo'). 2. Символ ошибки синтаксиса 9 сначала 'sed' (как вы можете видеть ...), что вы хотите сделать' sed'? 3. Вы не должны использовать обратные тики (устаревшие), вместо этого используйте $ (...). 4. Я думаю, что вы должны просмотреть свои '' '' '' '' '' '' '' '' 's, они такие странные. – syme

+0

Я избавился от' echo' и '>>' и положил назад назад тики, но я все еще получаю такие же ошибки. То, что я хочу, чтобы sed делал, это вывод 'bob, mel, sideshow-ws2' на вторую строку. Спасибо за вашу помощь. –

+0

Опять же: я не понимаю, что вы пытаетесь сделать с' sed'? Если вы хотите просто напечатать значения WORKSPACES, разделенных символом ',', просто используйте перенаправленные 'echo '$ {WORKSPACES [0]}, $ {WORKSPACES [1]}, $ {WORKSPACES [2]}" '? Нет? I не понимаю. – syme

ответ

1

echo -n позволяет печатать текст без LineBreak.

Для цикла по значениям массива, вы можете использовать для цикла:

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) 
+0

Вы получили это благодаря тому, что вы получаете кредит. :) –

+0

что если бы я хотел поставить '$ TODAY' в первом столбце, например:' 09-7-14, bob, mel, sideshow-ws2' –

+0

Просто добавьте его в список for-loop: 'for v в "$ TODAY" "$ {WORKSPACES [@]}" ' – syme

Смежные вопросы