LinuxForum.Fans
Тема

[Решено]сравнение массивов

Автор: prostornet 44 сообщений 8981 просмотров
#372124

Доброго времени суток.
Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.

Есть array1 (в нем 5 элементов, элементы меняются) и есть array2 (в нем 10 элементов, они постоянные)

#372132

Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.

#372154
Vascom написал:
Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.

Вот у меня и вопрос как внутри сравнить? Схемку бы?

#372158

На каком языке? На bash?

#372162

Думал как то так

text

for (( i=1;i<=10;i++ )); do
     
    if (( ${i} == ${array[$index]} ));
       then
       дуйствие раз
       else
       действие два
    fi

done

но не работает

#372164

Вот так:

text
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

#372179

"prostornet" написал:
Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
в баше это через задницу. Вам точно нужно именно массивы, или пойдут строки в файле? Это задачка от HR (экзамен, с другом поспорили)?
#372180
"Vascom" написал:
if [ ${a[$k]} -ne ${b[$n]} ]

правильнее

text
if [ "${a[$k]}" != "${b[$n]}" ]
#372182

На пару минут меня опередил :)
Только хотел написать, что в моём примере сравниваются числа, но можно конечно и строки, как показано выше. Просто под рукой был этот пример.
Ну и конечно работа в bash с массивами неудобна,, но для простых задач сойдёт.

#372184
"Vascom" написал:
Только хотел написать, что в моём примере сравниваются числа

числа в баше ((сравниваются так))

#372250
text
a="2 "; b=$'2\t'; [ "${a}" != "${b}" ]; echo $?

или ?

text
a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
#372297
"smaharbA" написал:
b=$'2\t'

вы ещё с ☣ сравните.

[console]$ a="2 "; b=$'2\t'; (( a != b )); echo $?
1
[/console]
проблемы, офицер?

#372298
"smaharbA" написал:
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]

#372321

как сравнивать правильно

2(пробел) и 2(табуляция)

как число или как текст ?

#372323
"smaharbA" написал:
как сравнивать правильно

2(пробел) и 2(табуляция)

как число или как текст ?

у этого вопроса два ответа:

1. как строка:

text
[ "$a" != "$b" ]

2. как число

text
(( a != b ))

А ваш способ неправильный в любом случае, и даёт правильный ответ только по странному совпадению.

#372325

Какой результат для обычного человека правильно выглядит ?

text
a="234   ";b=$'234\t\t\t'; (( a != b )); echo $?; [ "$a" != "$b" ]; echo $?
#372330
"smaharbA" написал:
Какой результат для обычного человека правильно выглядит ?

какая разница?

А что вам не нравится в ответе:
[console]$ a="234 ";b=$'234\t\t\t'; (( a != b )); echo $?
1
[/console]
?

выражение

text
234 != 234

очевидно ложно. В чём проблема?

Ваши \t ничего не меняют. А разве должны? Они же невидимые.

"smaharbA" написал:
[ "$a" != "$b" ]; echo $?

это сравнение строк. Ну и оно естественно пишет 0, что в этом странного? СТРОКИ РАЗНЫЕ.

#372344

В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
Код должен принимать решение при сравнении, конечно можно либо обрезать незначащие знаки (пробелы, табуляции, возвраты корретки и прочие) с двух сторон (trim) или тупо не использовать заключение в кавычки переменных (хоть и не всегда верно), а можно тут же "преобразовывать" строки в числа и т.д. и т.п.
ПС: Не всегда однозначен ответ на сабж.

#372349

"smaharbA" написал:
В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
никак. Делить на ноль нельзя. Это даже в php нельзя(результат сортировки массивов не определён. Да, 146% быдлокодеров не в курсе).

"smaharbA" написал:
Код должен принимать решение при сравнении
не должен. Код должен рухнуть с сообщением "сравнение тёплого с мягким".

"smaharbA" написал:
Не всегда однозначен ответ на сабж.
именно поэтому нельзя вычислить 0/0. Потому что может получится всё, что угодно.

Код(быдлокод точнее) ничего вам не должен, это вы должны не допускать неопределённости. Иначе вы не программист, а быдлокодер.
Войдите или зарегистрируйтесь, чтобы ответить.