Обновите значения в столбце в файле на основе значений из массива, используя скрипт bash - PullRequest
0 голосов
/ 14 марта 2020

У меня есть текстовый файл со следующими данными.

#test.txt

team_id   team_level  team_state
23            2         
21            4
45            5

У меня есть массив в моем коде teamsstatearr=(12 34 45 ...), и я хочу иметь возможность добавить значение в массиве в третий столбец. В массиве может быть много элементов, и файл test.txt - это лишь небольшая часть, которую я показал ниже.

Подробная информация о содержимом файла:

Текстовый файл имеет только три заголовка. Заголовки разделены табуляцией. Количество строк в файле также эквивалентно количеству элементов в массиве.

Таким образом, мой test.txt будет выглядеть следующим образом.

team_id   team_level  team_state
23            2         12
21            4         34
45            5         45

(many more rows are present)

Что я сделал на данный момент: я не вижу обновления файла в третьем столбце со значениями.

# Write the issue ids to file
for item in "${teamstatearr[@]}"
do
  printf '%s\n' "item id in loop: ${item}"
  awk -F, '{$2=($item)}1' OFS='\t',  test.txt
done

Буду признателен, если кто-нибудь поможет мне найти самый простой и эффективный способ сделать это.

1 Ответ

1 голос
/ 14 марта 2020

Если вы не возражаете против немного другого расположения таблицы, вы можете сделать:

teamsstatearr=(12 34 45)
{
  # print header
  head -n1 test.txt

  # combine the remaining lines of test.txt and the array values
  paste <(tail -n+2 test.txt) <(printf '%s\n' "${teamsstatearr[@]}")

  # use `column -t` to format the output as table
} | column -t

Вывод:

team_id  team_level  team_state
23       2           12
21       4           34
45       5           45

Чтобы записать вывод в тот же файл, вы можете перенаправить вывод в новый файл и перезаписать исходный файл с помощью mv:

teamsstatearr=(12 34 45)
{
  head -n1 test.txt
  paste <(tail -n+2 test.txt) <(printf '%s\n' "${teamsstatearr[@]}")
} | column -t > temp && mv temp test.txt

Если у вас установлен sponge из пакета moreutils, вы можете сделать это без временного файла:

teamsstatearr=(12 34 45)
{
  head -n1 test.txt
  paste <(tail -n+2 test.txt) <(printf '%s\n' "${teamsstatearr[@]}")
} | column -t | sponge test.txt

Или с использованием awk и column (с одинаковым выходом):

teamsstatearr=(12 34 45)
awk -v str="${teamsstatearr[*]}" '
  BEGIN{split(str, a)}  # split `str` into array `a`
  NR==1{print; next}    # print header 
  {print $0, a[++cnt]}  # print current line and next array element
' test.txt | column -t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...