首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历文件,并根据以下列中的信息将第一列分配给不同的变量

循环遍历文件,并根据以下列中的信息将第一列分配给不同的变量
EN

Stack Overflow用户
提问于 2017-04-13 17:29:54
回答 2查看 39关注 0票数 0

以下输入文件:

代码语言:javascript
复制
 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循环卡住了,这就是我想出来的,但我认为这是非常错误的。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-04-13 18:21:17

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-04-13 18:44:16

你最好一次搜索一天来解决这个问题,这样会更好:

代码语言:javascript
复制
#!/bin/bash
for day in "MO" "TU" "WE" "TH" "FR" "SA" "SU"
do
        mapfile $day < <(grep "$day" days | awk '{ printf $1"\n" }')
done

在这里,我们一次获取每一天,并使用这一天来搜索该天的文件(天)。然后通过awk解析输出,因为我们只关心第一列,并且在名称中添加新行,这样我们就可以通过映射文件通过管道传输输出,以创建与给定日期关联的数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43388512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档