【问题标题】:How to use associative arrays and match with indexed arrays?如何使用关联数组并与索引数组匹配?
【发布时间】:2018-05-04 00:44:08
【问题描述】:

在大多数情况下,此代码有效,我遇到的问题是我不知道如何使用关联数组的键并确保它与索引数组匹配。例如,代码将给出一个带有城市但名称如“亚特兰大”的菜单,但我需要在航空公司的文件中匹配它,因为它显示为 ATL。他们不会直接匹配。这是我的主要问题我不知道如何使两个阵列连接。 另一个问题是航空公司文件有额外的制表符间距。我试图修复它,但仍然不完美。

真的需要帮助!谢谢! 问题陈述:

airlinescities 这两个文件包含有关从选定城市到
的航空公司航班的信息 一些目的地。您的脚本应确定可能出发的城市列表,并提供可能的城市名称菜单:

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

【问题讨论】:

  • 你应该从文件中填写cities数组,而不是硬编码。
  • citiies 文件是否真的使用空格作为字段之间的分隔符,即使城市名称中也可以包含空格?还是它使用不同的字段分隔符,例如 TAB?
  • 是的,但我和我的教授谈过,他说我应该这样做,但如果你有更好的方法也可以
  • 城市文件只有空格,航空公司有标签等
  • 你确定吗?时区的排列方式看起来像是使用具有 4 列选项卡设置的选项卡。

标签: arrays linux bash shell


【解决方案1】:

您不需要索引数组,您需要两个关联数组,一个从缩写到全名,另一个则相反。

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 数组。然后您可以使用这些数组来查找匹配的航班。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2014-06-10
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2022-12-03
    相关资源
    最近更新 更多