Доброго времени суток.
Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
Есть array1 (в нем 5 элементов, элементы меняются) и есть array2 (в нем 10 элементов, они постоянные)
[Решено]сравнение массивов
Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.
Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.
Вот у меня и вопрос как внутри сравнить? Схемку бы?
На каком языке? На bash?
Да
Думал как то так
for (( i=1;i<=10;i++ )); do
if (( ${i} == ${array[$index]} ));
then
дуйствие раз
else
действие два
fi
done
но не работает
Вот так:
a=( 1 2 3 4 5 )
b=( 0 2 4 6 8 10 12 14 16 18 )
for ((k=0; k < 5 ; k++))
do
for ((n=0; n < 10 ; n++))
do
if [ ${a[$k]} -ne ${b[$n]} ]
then
echo "${a[$k]} ${b[$n]}" >> noteq_file
else
echo "${a[$k]} ${b[$n]}" >> eq_file
fi
done
done
в баше это через задницу. Вам точно нужно именно массивы, или пойдут строки в файле? Это задачка от HR (экзамен, с другом поспорили)?Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
if [ ${a[$k]} -ne ${b[$n]} ]
правильнее
if [ "${a[$k]}" != "${b[$n]}" ]На пару минут меня опередил :)
Только хотел написать, что в моём примере сравниваются числа, но можно конечно и строки, как показано выше. Просто под рукой был этот пример.
Ну и конечно работа в bash с массивами неудобна,, но для простых задач сойдёт.
Только хотел написать, что в моём примере сравниваются числа
числа в баше ((сравниваются так))
a="2 "; b=$'2\t'; [ "${a}" != "${b}" ]; echo $?или ?
a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?b=$'2\t'
вы ещё с ☣ сравните.
[console]$ a="2 "; b=$'2\t'; (( a != b )); echo $?
1
[/console]
проблемы, офицер?
a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
[console]$ a="2 2"; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
bash: [: слишком много аргументов
2
[/console]это дыра, т.к. данные из переменных ВНЕЗАПНО стали кодом.
[console]$ a="2 2"; b=$'2\t'; (( a != b )); echo $?
bash: ((: 2 2: синтаксическая ошибка в выражение (error token is "2")
1
[/console]а это НЕ дыра, а неправильные данные, число "2 2", которое не распознано как ЧИСЛО. Не, но можно конечно и оператор запихать, но он будет ВЫЧИСЛЯТЬСЯ, а не выполняться.
[console]$ a="c=3+8"; b=$'2\t'; (( a != b )); echo $?
0
[/console]
как сравнивать правильно
2(пробел) и 2(табуляция)
как число или как текст ?
как сравнивать правильно
2(пробел) и 2(табуляция)
как число или как текст ?
у этого вопроса два ответа:
1. как строка:
[ "$a" != "$b" ]2. как число
(( a != b ))А ваш способ неправильный в любом случае, и даёт правильный ответ только по странному совпадению.
Какой результат для обычного человека правильно выглядит ?
a="234 ";b=$'234\t\t\t'; (( a != b )); echo $?; [ "$a" != "$b" ]; echo $?Какой результат для обычного человека правильно выглядит ?
какая разница?
А что вам не нравится в ответе:
[console]$ a="234 ";b=$'234\t\t\t'; (( a != b )); echo $?
1
[/console]
?
выражение
234 != 234очевидно ложно. В чём проблема?
Ваши \t ничего не меняют. А разве должны? Они же невидимые.
[ "$a" != "$b" ]; echo $?
это сравнение строк. Ну и оно естественно пишет 0, что в этом странного? СТРОКИ РАЗНЫЕ.
В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
Код должен принимать решение при сравнении, конечно можно либо обрезать незначащие знаки (пробелы, табуляции, возвраты корретки и прочие) с двух сторон (trim) или тупо не использовать заключение в кавычки переменных (хоть и не всегда верно), а можно тут же "преобразовывать" строки в числа и т.д. и т.п.
ПС: Не всегда однозначен ответ на сабж.
никак. Делить на ноль нельзя. Это даже в php нельзя(результат сортировки массивов не определён. Да, 146% быдлокодеров не в курсе).В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
не должен. Код должен рухнуть с сообщением "сравнение тёплого с мягким".Код должен принимать решение при сравнении
именно поэтому нельзя вычислить 0/0. Потому что может получится всё, что угодно.Не всегда однозначен ответ на сабж.
Код(быдлокод точнее) ничего вам не должен, это вы должны не допускать неопределённости. Иначе вы не программист, а быдлокодер.