2010-01-02 3 views
1

У меня есть переменная со следующим содержимым: "a b c d e f g h i j k l", как бы вы начали добавлять знак запятой (,) после каждого третьего члена, чтобы он выглядел так: "a b c, d e f, g h i, j k l".Bash вставить запятую (,) после каждого третьего поля переменной или массива?

Первоначально все мои переменные данные хранятся в массиве, поэтому, если кто-либо знает, как напрямую манипулировать массивом, было бы здорово.

Заранее спасибо

ответ

4

AWK

$ echo "a b c d e f g h i j k l" | awk '{for(i=1;i<NF;i++)if(i%3==0){$i=$i","} }1' 
a b c, d e f, g h i, j k l 
+0

совершенны, что мне нужно, спасибо за быстрый ответ :) – f10bit

2

В Bash:

arr=(a b c d e f g h i j k l) 
ind=("${!arr[@]}") # get the indices of the array (handles sparse arrays) 
ind=(${ind[@]:0:${#ind[@]} - 1}) # strip off the last one 
# add commas to every third one (but the last) 
for i in "${ind[@]}"; do if ((i%3 == 2)); then arr[i]+=","; fi; done 
echo "${arr[@]}" # print the array 
declare -p arr # dump the array 

Результаты в:

a b c, d e f, g h i, j k l 
declare -a arr='([0]="a" [1]="b" [2]="c," [3]="d" [4]="e" [5]="f," [6]="g" [7]="h" [8]="i," [9]="j" [10]="k" [11]="l")' 

Если вы не возражаете, последний элемент также имеющий запятая, вы можете использовать индексы более непосредственно (пропустить строки, установленные $ind):

for i in "${!arr[@]}"; do if ((i%3 == 2)); then arr[i]+=","; fi; done 

Если вы не беспокоитесь о массиве, скудно:

for ((i=0; i<${#arr[@]}-1; i++)); do if ((i%3 == 2)); then arr[i]+=","; fi 

который в основном так же, как ghostdog74 игровых ответа кроме того, что Bash массивы основаны на нуле, а awk - на основе одного.

1

Или:

$ a=(a b c d e f g h i j k l) 
$ printf '%s\n' "${a[@]}"|paste -sd' ,' 
a b c,d e f,g h i,j k l 
1

Это может работать для вас:

echo "a b c d e f g h i j k l" | sed 's/\(\w \w \w\) /\1, /g' 
Смежные вопросы