以下输入文件:
AEGUEUS SA
APOLLO
ARES
ARTEMIS MO TU WE TH FR
ATHENA MO TU WE TH FR
HADES MO TU WE TH FR
AGAFYA MO TU WE TH FR
HERMES MO TU WE TH FR
HESTIA MO TU WE TH FR
POSEIDON MO TU WE TH FR
ATLAS MO TU WE TH FR
AURA MO TU WE TH FR
EOS MO TU WE TH FR
UBON MO TU WE TH FR
PERSES MO TU WE TH FR
PALLAS MO TU WE TH FR
STYX
UDOM SA
LETO MO TU WE TH FR
SELENE MO TU WE TH FR
ASTERIA MO WE FR SU
OCEANUS MO TU WE TH FR
CRONUS TU SU
ACHILLES TU SU我为每个工作日都有一个变量,如果以下列与工作日之一匹配,则应将第一列添加到相应的变量中。
例如,应将AEGUS添加到SA。阿波罗和ARES没有工作日,所以它们没有被添加到任何东西中。ARTEMIS应该被添加到MO TU WE TH中,雅典娜,哈迪斯等也是如此。
因此,我考虑的是将"while read line“循环放入每一行的数组中,然后对每一列进行大小写匹配,并根据大小写匹配填充变量。但我不知道如何正确地做这件事。我已经被while循环卡住了,这就是我想出来的,但我认为这是非常错误的。
while IFS=" " read -r line
do
array=($line)
for i in "${array[@]}"
do
case $i in
MO)
MO=()
MO+=("${array[1]}")
;;
TU)
TU=()
TU+=("${array[1]}")
;;
WE)
WE=()
WE+=("${array[1]}")
;;
TH)
TH=()
TH+=("${array[1]}")
;;
FR)
FR=()
FR+=("${array[1]}")
;;
SA)
SA=()
SA+=("${array[1]}")
;;
SO)
SO=()
SO+=("${array[1]}")
;;
esac
done < days.tmp发布于 2017-04-13 18:21:17
weekdays=(MO TU WE TH FR SA SU)
wdpat=$(IFS=\|; echo "${weekdays[*]}")
while read name days || [[ -n $name ]]; do
for day in $days; do
if [[ $day = @($wdpat) ]]; then
# safe because day contains MO .. SU
eval "$day"'+=( "$name" )'
fi
done
done
for day in "${weekdays[@]}"; do
ref="$day"'[@]'
echo "$day: ${!ref}"
done发布于 2017-04-13 18:44:16
你最好一次搜索一天来解决这个问题,这样会更好:
#!/bin/bash
for day in "MO" "TU" "WE" "TH" "FR" "SA" "SU"
do
mapfile $day < <(grep "$day" days | awk '{ printf $1"\n" }')
done在这里,我们一次获取每一天,并使用这一天来搜索该天的文件(天)。然后通过awk解析输出,因为我们只关心第一列,并且在名称中添加新行,这样我们就可以通过映射文件通过管道传输输出,以创建与给定日期关联的数组。
https://stackoverflow.com/questions/43388512
复制相似问题