#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: Верно, обновлено.