Как вырезать последние 3 элемента в массиве bash и добавить их в массив

Хорошо, я сейчас пишу скрипт, который будет брать файл с разделителем "~" и разбивать его. Однако это один элемент в массиве - элемент [5], который должен взять последние 3 слова этого элемента, вырезать их и присвоить им разные значения в массиве, а затем заново отрегулировать элемент [5], чтобы удалить эти Предметы. Я пробовал sed, cut и другие команды, но я потерян, однако. Я использую bash для этого скрипта, и ниже приведена краткая форма моей проблемы.

#!#!/bin/bash 
STR="FAILED~LOSS~Positive~MULTICOUNT~1~LOSS SUMMARY - Log: One vs TWO DAD MAR  DE~5~489646.22~469646.22~5" 
IFS="~" read -ra STR_ARRAY <<< "$STR"

for x in "${STR_ARRAY[@]}"
    do
            echo "> [$x]"
    done

Текущая печать:

[0] = FAILED
[1] = LOSS
[2] = Positive
[3] = MULTICOUNT
[4] = 1
[5] = LOSS SUMMARY - Log: One vs TWO DAD MAR DE
[6] = 5
[7] = 489646.22
[8] = 469646.22
[9] = 5 

Требуется печать:

[0] = FAILED
[1] = LOSS
[2] = Positive
[3] = MULTICOUNT
[4] = 1
[5] = LOSS SUMMARY - Log: One vs TWO 
[6] = DAD 
[7] = MAR 
[8] = DE
[9] = 5
[10] = 489646.22
[11] = 469646.22
[12] = 5 

2 ответа

Решение

Вы можете сделать это:

#!#!/bin/bash 
STR="FAILED~LOSS~Positive~MULTICOUNT~1~LOSS SUMMARY - Log: One vs TWO DAD MAR  DE~5~489646.22~469646.22~5" 
IFS="~" read -ra STR_ARRAY <<< "$STR"
IFS=" " read -ra T <<< "${STR_ARRAY[5]}"
STR_ARRAY2=("${STR_ARRAY[@]:0:5}" "${T[*]:0:${#T[@]} - 3}" "${T[@]:(-3)}" "${STR_ARRAY[@]:6}")
printf '%s\n' "${STR_ARRAY2[@]}"

Выход:

FAILED
LOSS
Positive
MULTICOUNT
1
LOSS SUMMARY - Log: One vs TWO
DAD
MAR
DE
5
489646.22
469646.22
5

Настройте ваш STR на NEW_STR и используйте его с IFS=~ (небольшое изменение в 2 строки)

$ cat 1.sh
#!/bin/bash
STR="FAILED~LOSS~Positive~MULTICOUNT~1~LOSS SUMMARY - Log: One vs TWO DAD MAR  DE~5~489646.22~469646.22~5"

NEW_STR="$(echo $STR | sed "s/TWO DAD MAR DE/TWO~DAD~MAR~DE/")"

IFS="~" read -ra STR_ARRAY <<< "$NEW_STR"
for x in "${STR_ARRAY[@]}"
    do
            echo "> [$x]"
done

Выход:

$ ./1.sh
> [FAILED]
> [LOSS]
> [Positive]
> [MULTICOUNT]
> [1]
> [LOSS SUMMARY - Log: One vs TWO]
> [DAD]
> [MAR]
> [DE]
> [5]
> [489646.22]
> [469646.22]
> [5]
Другие вопросы по тегам