Home > Blockchain >  Bash script how to compare arrays elementh to string
Bash script how to compare arrays elementh to string

Time:11-13

The testhomerseklet3.txt contains (in each row) an 'x' and 'y' coordinates, a date, and a time. This script is called with 2 arugment, and 'x' and a 'y' coordinated. I need to write out how many times are there datas at 'x,y' coordinates on different days.

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 ] && [ $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"

here's the homerseklettest3.txts content

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

CodePudding user response:

  • [ $x = $1 ] && [ $y = $2 ] only works if all the variables are non-empty and don't contain spaces. Double quote the variables or use [[ ... ]] as I did.
  • When assigning to a variable, don't use the dollar sign: $isDateAlready=1 is wrong.
  • When adding an element to an array, use parenthses, dateT =$date just concatenates.
#! /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 && $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"

But

using an associative array makes the code much simpler. You can also use IFS to avoid the need to use cut three times.

#! /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 && $y = $2 && ! ${dateT[$date]} ]] ; then
        ((  howMany))
        dateT[$date]=1
    fi
done < 1 # homerseklettest3.txt

echo "result: $howMany"
  •  Tags:  
  • bash
  • Related