Скрипт Bash, как сравнить массивы elementh со строкой

#bash

Вопрос:

В testhomerseklet3.txt содержит (в каждой строке) координаты » x » и «y», дату и время. Этот сценарий вызывается с 2-мя символами, и «x» и «y» согласованы. Мне нужно записать,сколько раз есть данные в координатах «x, y» в разные дни.

 howMany=0
declare -a dateT
echo "1 parameter: $1"
echo "2 parameter: $2"
echo
while read line 
do
    x=`echo $line | cut -d "," -f 1`
    y=`echo $line | cut -d "," -f 2` 
    date=`echo $line | cut -d "," -f 3`

    echo $x
    echo $y
    echo $date 
    
    isDateAlready=0
    
    if [ $x = $1 ] amp;amp; [ $y = $2 ]
    then               
        for dates in "${!dateT[@]}"
        do            
            if [ ${dateT[$dates]} = $date ]
            then                                
                $isDateAlready=1
            fi
        done        
        if [ $isDateAlready -eq 0 ]
        then
            howMany=$(($howMany   1))
            dateT =$date
        fi        
    fi    
done <<< $(cat homerseklettest3.txt)

echo "eredmeny: $howMany"
 

вот содержание homerseklettest3.txts

 23.1231234,69.9651548,2000.11.13,7:42,69
69.6969696,11.1111111,1985.8.25,1:1,1
11.2222222,22.3333333,6969.10.1,18:12,23
47.6498634,43.2312457,2120.2.30,14:14,24
92.7418529,99.9999999,1500.10.9,9:20,69
92.7418529,99.9999999,1760.5.10,5:20,21
23.1231234,69.9651548,2010.8.20,16:36,96
92.7418529,99.9999999,1761.5.10,5:20,21
92.7418529,99.9999999,1760.5.10,5:20,21
 

Комментарии:

1. Возникает вопрос, в чем проблема, каков ожидаемый результат, откуда берутся данные-может быть, больше.

2. Моя вина, что это было действительно плохо сформулировано. Я редактирую вопрос, чтобы быть более конкретным.

Ответ №1:

  • [ $x = $1 ] amp;amp; [ $y = $2 ] работает только в том случае, если все переменные непусты и не содержат пробелов. Дважды заключите переменные в кавычки или используйте [[ ... ]] , как я это сделал.
  • При назначении переменной не используйте знак доллара: $isDateAlready=1 неверно.
  • При добавлении элемента в массив используйте круглые скобки, dateT =$date просто объединяйте.
 #! /bin/bash
howMany=0
declare -a dateT
echo "1 parameter: $1"
echo "2 parameter: $2"
echo
while read line ; do
    x=`echo $line | cut -d "," -f 1`
    y=`echo $line | cut -d "," -f 2`
    date=`echo $line | cut -d "," -f 3`

    echo x:$x
    echo y:$y
    echo date:$date

    isDateAlready=0

    if [[ $x = $1 amp;amp; $y = $2 ]] ; then
        for dates in "${!dateT[@]}" ; do
            if [ ${dateT[$dates]} = $date ] ; then
                isDateAlready=1
            fi
        done
        if [ $isDateAlready -eq 0 ] ; then
            howMany=$(($howMany   1))
            dateT =($date)
        fi
    fi
done < homerseklettest3.txt

echo "result: $howMany"
 

Но

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

 #! /bin/bash
howMany=0
declare -A dateT
echo "1 parameter: $1"
echo "2 parameter: $2"
echo
while IFS=, read x y date ; do
    echo x:$x
    echo y:$y
    echo date:$date

    if [[ $x = $1 amp;amp; $y = $2 amp;amp; ! ${dateT[$date]} ]] ; then
        ((  howMany))
        dateT[$date]=1
    fi
done < 1 # homerseklettest3.txt

echo "result: $howMany"
 

Комментарии:

1. И давайте read разделим поля: while IFS=, read -r x y date; do ...

2. @glennjackman: Верно, обновлено.