Как использовать ассоциативные массивы и сопоставлять с индексированными массивами? - PullRequest
0 голосов
/ 04 мая 2018

По большей части этот код работает, у меня проблема в том, что я не знаю, как использовать ключ ассоциативных массивов и убедиться, что он совпадает с индексированным массивом. Например, код даст меню с городами, но с такими названиями, как «Атланта», но мне нужно сопоставить его в файле авиакомпании, поскольку он отображается как ATL. Они не будут напрямую соответствовать. Это главная проблема, которую я имею, я не знаю, как соединить два массива. Также еще одной проблемой является то, что в файле Airlines есть дополнительный интервал табуляции. Я пытался это исправить, но все еще не идеально.

Действительно нужна помощь! Спасибо! Постановка задачи:

Два файла, airlines и cities, содержат информацию о рейсах авиакомпаний из выбранных городов в
некоторые направления. Ваш скрипт должен определить список городов, в которых возможны выезды, и представить меню возможных названий городов:

Please select the departure city:
1) Atlanta 4) Denver 7) Las Vegas 10) San Francisco
2) Boston 5) Detroit 8) Los Angeles 11) Syracuse
3) Chicago 6) Houston 9) Pittsburgh

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

Ваш сценарий не должен жестко кодировать названия городов или аэропортов, а должен извлекать их из файлы предоставляются.

Цель состоит в том, чтобы отобразить меню городов для отправления, а затем выбрать другое меню для пункта назначения. Затем эти два должны быть сопоставлены, чтобы найти, какие рейсы существуют.

#!/bin/bash
#cities=$1
#airlines=$2
OLDIFS=$IFS
IFS=$'\n'
PS3='Please select the departure city: '
cities=($(cut -f2 cities| sort -u))

select opt in "${cities[@]}"
do 
  case $opt in
     "$opt") echo "$opt"
         break;;
    esac 

done
cities=$opt
#need help with this part
declare -A city
city[ATL]=Atlanta
city[IAH]=Houston
city[DTW]=Detroit
city[LAS]="Las Vegas"
city[DEN]=Denver
city[PIT]=Pittsburgh
city[ORD]=Chicago
city[SFO]="San Francisco"
city[BOS]=Boston
city[SYR]=Syracuse
city[LAX]="Los Angeles"
city[DFW]=Dallas #not on list

airlines=($(cut -f4 $2 |sed -e 's/[[:space:]]\+/ /g' | sort -u ))

OLDIFS=$IFS
IFS=$'\n'
PS3='Select a destination: '
select option in "${airlines[@]}"
do 
    case $option in
     "$option") echo "$option"
          break;;
       esac
done


IFS=$'\t'
while read -r A B C D E F G H 
do
if [  $opt  = $D ] && [ $option = $F ]; then
echo "Flight: $A $B $C $D $E $F $G $H"
else
echo "$A $B $C $D $E $F $G $H" > temp 
check=($(wc -l temp))
#echo $check
if [[ $check = 0 ]]; then
 echo "Sorry no flights are available"
fi 
fi
done < $2
#rm temp

файл города

ATL Atlanta EST
DTW Detroit EST
IAH Houston CST
DFW Dallas  CST
DEN Denver  MST
LAX Los Angeles PST
SFO San Francisco   PST
MSN Madison CST
BOS Boston  EST
PIT Pittsburgh  EST
ORD Chicago CST
SAN San Diego   PST
LAS Las Vegas   PST
SYR Syracuse    EST

файл авиакомпании:

DL  Delta   490 ATL 6:30a   DTW 8:22a
DL  Delta   738 ATL 8:25a   DTW 10:10a
DL  Delta   1221    ATL 9:45a   DTW 11:33a
DL  Delta   796 ATL 12:25p  DTW 1:50p
DL  Delta   1818    ATL 3:50p   DTW 5:40p
DL  Delta   546 IAH 6:10a   ATL 9:06a
UA  United  1000    IAH 7:05a   ATL 10:03a
DL  Delta   1032    IAH 9:30a   ATL 12:19p
DL  Delta   490 DTW 9:25a   MSN 9:42a
DL  Delta   1202    DTW 12:20p  MSN 12:37p
DL  Delta   163 DTW 7:25a   ORD 7:44a
DL  Delta   485 DTW 10:10p  MSN 10:21p
UA  United  1015    ATL 6:15a   IAH 7:20a
DL  Delta   1681    ATL 10:30a  IAH 11:29a
UA  United  1199    IAH 8:15a   LAX 9:39a
UA  United  535 IAH 2:25p   LAX 3:54p
UA  United  1683    LAS 8:00a   SFO 9:46a
UA  United  6659    LAS 4:29p   SFO 6:09p
AA  American    4055    ORD 8:44a   MSN 9:39a
UA  United  1522    DEN 12:20a  SFO 2:00a
UA  United  1521    DEN 11:30a  SFO 1:10p
DL  Delta   101 ATL 11:55a  IAH 12:50p
US  USAir   246 PIT 12:05p  DFW 2:25p
US  USAir   101 PIT 12:15a  ORD 11:45p
US  USAir   2966    LAS 10:20a  SFO 11:54a
UA  United  2578    SFO 8:39a   SAN 10:07a
US  USAir   2967    SFO 12:25p  LAS 1:54p
AA  American    111 ORD 12:34p  LAX 2:50p
DL  Delta   432 BOS 8:45a   ATL 11:00a
AA  American    2345    LAX 11:40p  ORD 5:55a
DL  Delta   2006    SYR 5:53p   ATL 8:18p
AA  American    3542    ORD 3:00p   SYR 5:39p

1 Ответ

0 голосов
/ 04 мая 2018

Вам не нужен индексированный массив, вам нужны два ассоциативных массива, один из которых идет от аббревиатур до полных имен, а другой идет другим путем.

declare -A city_by_abbrev
declare -A city_by_name
while IFS=$'\t' read abbrev name tz; do
    city_by_abbrev[$abbrev]=$name
    city_by_name[$name]=$abbrev
done < cities

while :; do
    select city_name in "${city_by_abbrev[@]}"; do
        if [[ -n $city_name ]]; then
            break;
        fi
    done
done

city_abbrev=${city_by_name[$city_name]}

Вы можете использовать похожую технику для заполнения массива airlines из этого файла. Затем вы можете использовать эти массивы для поиска подходящих рейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...