1 (17.03.2014 17:59:47 отредактировано prostornet)

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

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

2

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

3 (14.03.2014 16:13:42 отредактировано prostornet)

Vascom пишет:

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

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

4

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

5

Да

6

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

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

done

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

7

Вот так:

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

8

prostornet пишет:

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

в баше это через задницу. Вам точно нужно именно массивы, или пойдут строки в файле? Это задачка от HR (экзамен, с другом поспорили)?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9 (14.03.2014 18:03:08 отредактировано drBatty)

Vascom пишет:

if [ ${a[$k]} -ne ${b[$n]} ]

правильнее

if [ "${a[$k]}" != "${b[$n]}" ]
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10

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

11

Vascom пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

12

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

или ?

a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
Я конечно далек от мысли...(с)

13

smaharbA пишет:

b=$'2\t'

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

 Консоль:
$ a="2 "; b=$'2\t'; (( a != b )); echo $?
1

проблемы, офицер?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

14

smaharbA пишет:

a="2 "; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?

 Консоль:
$ a="2 2"; b=$'2\t'; [ ${a} -ne ${b} ]; echo $?
bash: [: слишком много аргументов
2
это дыра, т.к. данные из переменных ВНЕЗАПНО стали кодом.

 Консоль:
$ a="2 2"; b=$'2\t'; (( a != b )); echo $?
bash: ((: 2 2: синтаксическая ошибка в выражение (error token is "2")
1
а это НЕ дыра, а неправильные данные, число "2 2", которое не распознано как ЧИСЛО. Не, но можно конечно и оператор запихать, но он будет ВЫЧИСЛЯТЬСЯ, а не выполняться.
 Консоль:
$ a="c=3+8"; b=$'2\t'; (( a != b )); echo $?
0

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

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

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

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

Я конечно далек от мысли...(с)

16

smaharbA пишет:

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

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

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

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

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

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

2. как число

(( a != b ))

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

17

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

a="234   ";b=$'234\t\t\t'; (( a != b )); echo $?; [ "$a" != "$b" ]; echo $?
Я конечно далек от мысли...(с)

18

smaharbA пишет:

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

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

А что вам не нравится в ответе:

 Консоль:
$ a="234   ";b=$'234\t\t\t'; (( a != b )); echo $?
1

?

выражение

234 != 234

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

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

smaharbA пишет:

[ "$a" != "$b" ]; echo $?

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

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

Я конечно далек от мысли...(с)

20

smaharbA пишет:

В том и вопрос, если массив из разных "типов" данных (пусть и нет в шелах типизации) - как сравнивать ?

никак. Делить на ноль нельзя. Это даже в php нельзя(результат сортировки массивов не определён. Да, 146% быдлокодеров не в курсе).

smaharbA пишет:

Код должен принимать решение при сравнении

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

smaharbA пишет:

Не всегда однозначен ответ на сабж.

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

21

Есть ряд массивов подобных такому

Вася Пупкин
234
10/01/2001
True
Ложь

Как не допустить неопределенности ?

Я конечно далек от мысли...(с)

22

smaharbA пишет:

Как не допустить неопределенности ?

придумать однозначные правила преобразования типов. Как в php например.

Или вообще запретить любые преобразования, как в нормальных ЯП. IRL конечно "нормальные ЯП" со строгой типизацией значения не имеют(практического), и пользуются обычными ЯП, но нужно помнить, о том, что сладкое всё равно нет смысла сравнивать с солёным. Даже если ЯП это допускает. Сишачка/пхп допускают, и получается ерунда.

Потому и рекомендую юзать (( )), т.к. этот способ ГАРАНТИРОВАННО интерпретирует значение В ЧИСЛО, а не в хрен знает что.

ЗЫЖ кстати ТС не написал, какой он смысл вкладывает в элементы массивов. И т.к. в bash имеется всего два типа, то для ТСа есть два решения. ЛИБО одно, ЛИБО второе. Но не оба сразу. Потому-как переменная не может быть числом и строкой одновременно. Возможна только разная интерпретация.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

23

Для нормального человека

2. Вася

всегда стоит впереди чем

12. Агафон

а вот для большинства сортировок в шелах и прочих лс наоборот (тока не надо учить всевозможным ls -v и прочим sort -n, они в самый раз делают почти то, что выше названо "код должен...")
(о неопределенности)

Я конечно далек от мысли...(с)

24

smaharbA пишет:

2. Вася

всегда стоит впереди чем

12. Агафон

не всегда. А что такое 2/12? Если это порядковый номер, то почему не по порядку?

12 Агафон
26 Коля
2 Вася
14 Маша
13 Лиза
26 Лаура
17 Вася

что это за список, и с какого перепугу третью строчку надо заменить на первую? А что делать с остальными?

smaharbA пишет:

тока не надо учить

а я и не буду. Вы необучаемы. Вам видимо не дано понять, что "строка" и "число",  разные вещи. И что сортировки тоже разные бывают, одни строчки сортируют, другие числа, а третьи ещё что-то.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

25

Vascom пишет:

Вот так:

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
drBatty пишет:
Vascom пишет:

if [ ${a[$k]} -ne ${b[$n]} ]

правильнее

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

это не совсем правильно, так как во втором файле я получаю вместо 8 результатов (несовпавших цифр) 48 результатов (задвоенных)

26 (17.03.2014 09:38:24 отредактировано prostornet)

drBatty пишет:
prostornet пишет:

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

в баше это через задницу. Вам точно нужно именно массивы, или пойдут строки в файле? Это задачка от HR (экзамен, с другом поспорили)?

Нет это не задачка и не спор, посути это лень, я не хочу вводит пару команд и потом всматриваться в результаты и выискивать нужное. Хочется нажать кнопку [сделать красиво] и получить результат.

27

Ну ты задачу опиши получше, или сам переделай вывод в файл как тебе требуется. Это же лишь пример, показывающий как реализовать сравнение.

28

Вот именно это у меня и не получается, такой задвоенный вывод я и до этого получал.
А задачу я вроде с самого начала описал. Есть два массива с цифрами, сравниваем, в один файл цифры совпашие, а в другой те что не совпали, но все в единичном экземпляре.

29 (17.03.2014 10:00:31 отредактировано Vascom)

Пример массивов и выходных файлов можешь дать?
"те что не совпали, но все в единичном экземпляре" - не понятно.

30 (17.03.2014 10:10:05 отредактировано prostornet)

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 её не вывели) и т.д.