Установить переменную равной значению на основе совпадения в bash - PullRequest
1 голос
/ 01 марта 2020

У меня есть скрипт, в котором я хочу установить переменную, равную указанному c значению на основе совпадения из файла (в bash).

Например:

Файл в .csv содержит:

Name,ID,Region
Device1,1,USA
Device2,2,UK

Я хочу объявить переменные в начале следующим образом:

region1=USA
regions2=UK
region3=Ireland
etc...

Затем, читая csv, мне нужно сопоставить Region имя столбца для глобальной переменной, установленной в начале файла, чтобы затем использовать его в API. Поэтому, если устройство в csv имеет набор регионов США, я должен иметь возможность использовать region1 во время вызова обновления в API. Я хочу использовать while l oop, чтобы построчно перебирать файл csv и обновлять регион каждого устройства.

Может кто-нибудь знает, как мне этого добиться? Любая помощь будет принята с благодарностью.

PS: Это не домашнее задание, прежде чем кто-нибудь спросит: -)

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

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

declare -A regions              # an associative array

# declare your variables
region1=USA
region2=UK
region3=Ireland

# associate each region's name with region's code
for i in "${!region@}"; do      # expands to region1, region2, region3
    varname="$i"
    regions[${!varname}]="$i"   # maps "USA" to "region1", "UK" to "region2" ..
done

while IFS=, read -r name id region; do
    ((nr++)) || continue        # skips the header line
    region_group="${regions[$region]}"
    echo "region=$region, region_group=$region_group"   # for a test
    # call API here
done < file.csv

Вывод:

region=USA, region_group=region1
region=UK, region_group=region2
region=Ireland, region_group=region3

Кстати, если объявление переменной в начале находится под вашим контролем, будет проще сказать:

# declare an associative aarray
declare -A regions=(
    [USA]="region1"
    [UK]="region2"
    [Ireland]="region3"
)

while IFS=, read -r name id region; do
    ((nr++)) || continue        # skip the header line
    region_group="${regions[$region]}"
    echo "region=$region, region_group=$region_group"   # for a test
    # call API here
done < file.csv
0 голосов
/ 01 марта 2020

Используйте awk для создания таблицы поиска. например:

$ cat a.sh
#!/bin/sh

cat << EOD |
region1=USA
region2=UK
region3=Ireland
EOD
{
awk 'NR==FNR { lut[$2] = $1; next}
{$3 = lut[$3]} 1
' FS== /dev/fd/3 FS=, OFS=, - << EOF
Name,ID,Region
Device1,1,USA
Device2,2,UK
EOF
} 3<&0
$ ./a.sh
Name,ID,
Device1,1,region1
Device2,2,region2

или, чуть менее неясный (и более переносимый, чтобы просто использовать обычные файлы, я не уверен насчет платформ, на которых действительно действует /dev/fd/3:

$ cat input
Name,ID,Region
Device1,1,USA
Device2,2,UK
$ cat lut
region1=USA
region2=UK
region3=Ireland
$ awk 'NR==FNR{lut[$2] = $1; next} {$3 = lut[$3]} 1' FS== lut FS=, OFS=, input
Name,ID,
Device1,1,region1
Device2,2,region2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...