Объединить строки, содержащиеся в переменных, разделенных новой строкой - PullRequest
0 голосов
/ 25 октября 2019

У меня в Bash три переменные, каждая из которых содержит строки, разделенные новой строкой, например:

Переменная A:

one
two
three

Переменная B:

Mon
Tue
Wed

Переменная C:

10
11
12

Три переменные всегда содержат одинаковое количество элементов, разделенных новой строкой.

Моя цель - взять строку (начиная с первого1) из переменной A добавьте немного текста между ними, затем возьмите строку из переменной B, снова добавьте немного текста между ними, и, наконец, возьмите строку из переменной C и добавьте немного текста в конце. Затем я хочу добавить результат этого к конечной переменной, скажем, $ final, чтобы после завершения цикла (т. Е. Мы прошли все строки), он должен выглядеть следующим образом:

one - Mon [10]; two - Tue [11]; three - Wed [12]

Способен ли awk на это или мне следует использовать другие инструменты?

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Я думаю, я бы пошел с:

paste <(echo "$A") <(echo "$B") <(echo "$C") \
| awk '{printf "%s - %s [%s]; ", $1, $2, $3}'
2 голосов
/ 25 октября 2019

Не могли бы вы попробовать следующее:

# assign the variables
variableA="one
two
three"

variableB="Mon
Tue
Wed"

variableC="10
11
12"

# transform the variables to arrays
readarray -t aryA <<< "$variableA"
readarray -t aryB <<< "$variableB"
readarray -t aryC <<< "$variableC"

# construct the variable $final
for ((i=0; i<3; i++)); do
    final+="${aryA[$i]} - ${aryB[$i]} [${aryC[$i]}]; "
done

# remove trailing semicolon and whitespace
final="${final%;*}"

echo "$final"

Вывод:

one - Mon [10]; two - Tue [11]; three - Wed [12]

[Объяснение]

  • readarray (или mapfile) читает стандартную строку ввода за строкой и помещает каждую строку в элемент массива.
  • То есть, если variableA, содержащий три строки, передается в readarray, тогда массивaryA создается, содержащий aryA[0]=one, aryA[1]=two и т. Д.
  • Затем создается переменная final путем добавления элементов массивов.

Hopeэто помогает.

...