Доброго времени суток.
Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
Есть array1 (в нем 5 элементов, элементы меняются) и есть array2 (в нем 10 элементов, они постоянные)
Настоятельно просим вас при общении соблюдать Правила форума и законы РФ. Наша тематика вне политики, поэтому воздержитесь от обсуждения ситуации на Украине и связанных с ней событий, независимо от того, какую сторону вы поддерживаете.
Также напоминаем, что наш форум находится в доменной зоне .ru, физически расположен на российских серверах и мы соблюдаем действующее законодательство России. Любые сообщения о политике будут удаляться.
Linux Forum → Работа в командной строке → [Решено]сравнение массивов
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго времени суток.
Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
Есть array1 (в нем 5 элементов, элементы меняются) и есть array2 (в нем 10 элементов, они постоянные)
Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.
Делаешь два вложенных цикла for. Один по элементам первого массива, второй по элементам второго массива. Внутри сравниваешь и выводишь элементы куда требуется.
Вот у меня и вопрос как внутри сравнить? Схемку бы?
Да
Думал как то так
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'
вы ещё с ☣ сравните.
a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
как сравнивать правильно
2(пробел) и 2(табуляция)
как число или как текст ?
как сравнивать правильно
2(пробел) и 2(табуляция)
как число или как текст ?
у этого вопроса два ответа:
1. как строка:
[ "$a" != "$b" ]2. как число
(( a != b ))А ваш способ неправильный в любом случае, и даёт правильный ответ только по странному совпадению.
Какой результат для обычного человека правильно выглядит ?
a="234 ";b=$'234\t\t\t'; (( a != b )); echo $?; [ "$a" != "$b" ]; echo $?Какой результат для обычного человека правильно выглядит ?
какая разница?
А что вам не нравится в ответе:
выражение
234 != 234очевидно ложно. В чём проблема?
Ваши \t ничего не меняют. А разве должны? Они же невидимые.
[ "$a" != "$b" ]; echo $?
это сравнение строк. Ну и оно естественно пишет 0, что в этом странного? СТРОКИ РАЗНЫЕ.
В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
Код должен принимать решение при сравнении, конечно можно либо обрезать незначащие знаки (пробелы, табуляции, возвраты корретки и прочие) с двух сторон (trim) или тупо не использовать заключение в кавычки переменных (хоть и не всегда верно), а можно тут же "преобразовывать" строки в числа и т.д. и т.п.
ПС: Не всегда однозначен ответ на сабж.
В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?
никак. Делить на ноль нельзя. Это даже в php нельзя(результат сортировки массивов не определён. Да, 146% быдлокодеров не в курсе).
Код должен принимать решение при сравнении
не должен. Код должен рухнуть с сообщением "сравнение тёплого с мягким".
Не всегда однозначен ответ на сабж.
именно поэтому нельзя вычислить 0/0. Потому что может получится всё, что угодно.
Код(быдлокод точнее) ничего вам не должен, это вы должны не допускать неопределённости. Иначе вы не программист, а быдлокодер.
Есть ряд массивов подобных такому
Вася Пупкин
234
10/01/2001
True
Ложь
Как не допустить неопределенности ?
Как не допустить неопределенности ?
придумать однозначные правила преобразования типов. Как в php например.
Или вообще запретить любые преобразования, как в нормальных ЯП. IRL конечно "нормальные ЯП" со строгой типизацией значения не имеют(практического), и пользуются обычными ЯП, но нужно помнить, о том, что сладкое всё равно нет смысла сравнивать с солёным. Даже если ЯП это допускает. Сишачка/пхп допускают, и получается ерунда.
Потому и рекомендую юзать (( )), т.к. этот способ ГАРАНТИРОВАННО интерпретирует значение В ЧИСЛО, а не в хрен знает что.
ЗЫЖ кстати ТС не написал, какой он смысл вкладывает в элементы массивов. И т.к. в bash имеется всего два типа, то для ТСа есть два решения. ЛИБО одно, ЛИБО второе. Но не оба сразу. Потому-как переменная не может быть числом и строкой одновременно. Возможна только разная интерпретация.
Для нормального человека
2. Вася
всегда стоит впереди чем
12. Агафон
а вот для большинства сортировок в шелах и прочих лс наоборот (тока не надо учить всевозможным ls -v и прочим sort -n, они в самый раз делают почти то, что выше названо "код должен...")
(о неопределенности)
2. Вася
всегда стоит впереди чем
12. Агафон
не всегда. А что такое 2/12? Если это порядковый номер, то почему не по порядку?
12 Агафон
26 Коля
2 Вася
14 Маша
13 Лиза
26 Лаура
17 Васячто это за список, и с какого перепугу третью строчку надо заменить на первую? А что делать с остальными?
тока не надо учить
а я и не буду. Вы необучаемы. Вам видимо не дано понять, что "строка" и "число", разные вещи. И что сортировки тоже разные бывают, одни строчки сортируют, другие числа, а третьи ещё что-то.
Вот так:
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
Vascom пишет:if [ ${a[$k]} -ne ${b[$n]} ]
правильнее
if [ "${a[$k]}" != "${b[$n]}" ]
это не совсем правильно, так как во втором файле я получаю вместо 8 результатов (несовпавших цифр) 48 результатов (задвоенных)
prostornet пишет:Подскажите пожалуйста как сравнить два массива и вывести совподающие элементы в один файл, а отличающиеся в другой.
в баше это через задницу. Вам точно нужно именно массивы, или пойдут строки в файле? Это задачка от HR (экзамен, с другом поспорили)?
Нет это не задачка и не спор, посути это лень, я не хочу вводит пару команд и потом всматриваться в результаты и выискивать нужное. Хочется нажать кнопку [сделать красиво] и получить результат.
Ну ты задачу опиши получше, или сам переделай вывод в файл как тебе требуется. Это же лишь пример, показывающий как реализовать сравнение.
Вот именно это у меня и не получается, такой задвоенный вывод я и до этого получал.
А задачу я вроде с самого начала описал. Есть два массива с цифрами, сравниваем, в один файл цифры совпашие, а в другой те что не совпали, но все в единичном экземпляре.
Пример массивов и выходных файлов можешь дать?
"те что не совпали, но все в единичном экземпляре" - не понятно.
array_a = (2 3 6 9)
array _b = (1 2 3 4 5 6 7 8 9 10)
file_a: 2 3 6 9
file_b: 1 4 5 7 8 10
P.S.: без повторений как в цикле for for if и во втором файле получаем вывод: 1 3 4 5 6 7 8 9 10 (совпала 2 её не вывели) 1 2 4 5 6 7 8 9 10 (совпала 3 её не вывели) и т.д.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Linux Forum → Работа в командной строке → [Решено]сравнение массивов
Форум работает на PunBB, при поддержке Informer Technologies, Inc