2017-04-13 5 views
0

におけるに関する情報に基づいて、異なる変数に最初の列を割り当てる:場合、私は各平日のために変数を有するファイルを介して回転させ、入力ファイルの後、次の列

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に追加する必要があります。 APOLLOとARESは平日がないので、何にも追加されません。 ARTEMISはATHENA、HADESなどと同じようにMO TU WE TH FRに追加する必要があります.....

私は、各行の配列に「読み込み中の線」ループのようなものを考えましたが、各列の大文字小文字を区別し、それに基づいて変数を入力します。しかし、私はこれを適切に行う方法を知りません。私はすでに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 

答えて

0
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

一度に1日の検索の問題にアプローチし、そのような何かしたほうが良いでしょう。ここでは、一度に毎日取ると、検索するために、1日に使用

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

その日のファイル(日)。出力は最初の列のみに関係するのでawkを通して解析され、新しい行が名前に追加されます。その結果、マップファイルを介して出力をパイプして、その日に関連付けられた配列を作成できます。

関連する問題