31

prostornet пишет:

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

man sort
man uniq

Если хотите конкретику, то данные покажите. Или читайте маны самостоятельно.

Третий вариант: денег заплатить кому-нить.

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

32

prostornet пишет:

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

откуда вы массивы взяли?

ну сделайте третий массив, массив совпадений.

если совсем лень: http://us1.php.net/manual/ru/function.a … ersect.php

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

33

Подскажите тогда как реализовать цикл:

есть var1 я её сравниваю с var2, которая если не равна var1 мы её увеличиваем на 1 и опять проверяем.

Есть уже цикл while read line; do новый цикл описанный выше done < ${FILE}

34

prostornet,

#!/bin/bash

(( J_MAX = 5 ))

for (( J = 0; J < J_MAX; J++ )); do
    echo "J=$J"
done
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

35

prostornet, вы мне надоели, с вас $5 за решение

#!/bin/bash

A=(2 3 6 9)
B=(1 2 3 4 5 6 7 8 9 10)

echo "A: '${A[@]}', B: '${B[@]}'"

# intersect A B

MAX_INDEX_A=${#A[@]}
MAX_INDEX_B=${#B[@]}
for (( INDEX_A = 0; INDEX_A < MAX_INDEX_A; INDEX_A++ )); do
    for (( INDEX_B = 0; INDEX_B < MAX_INDEX_B; INDEX_B++ )); do
        if (( ${A[$INDEX_A]} == ${B[$INDEX_B]} )); then
            echo $INDEX_A $INDEX_B ${A[$INDEX_A]}
        fi
    done
done

 Консоль:
A: '2 3 6 9', B: '1 2 3 4 5 6 7 8 9 10'
0 1 2
1 2 3
2 5 6
3 8 9

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

36

drBatty пишет:

prostornet, вы мне надоели, с вас $5 за решение

 Консоль:
A: '2 3 6 9', B: '1 2 3 4 5 6 7 8 9 10'
0 1 2
1 2 3
2 5 6
3 8 9

Я не против пяти баксов, но такое решение (вывод только совпавших цифр в массиве A и B) у меня было готово сразу (только без вывода индекса ), о чем я уже писал.
А вот вывод несовпавших цифр (1 4 5 6 7 8 10) это как?
Если в Ваш скрипт добавить строки:

else 
     echo ${B[$INDEX_B]}

вот тут получается множественный вывод несовпавших цифр.
У меня был вопрос возможно ли это решить без sort и uniq, с помощью циклов?

37

prostornet пишет:

вот тут получается множественный вывод несовпавших цифр.

тогда так:

#!/bin/bash

A=(2 3 6 9)
B=(1 2 3 4 5 6 7 8 9 10)

echo "A: '${A[@]}', B: '${B[@]}'"

# intersect A B

LAST_NE="-1" # таких чисел не бывает

MAX_INDEX_A=${#A[@]}
MAX_INDEX_B=${#B[@]}
for (( INDEX_A = 0; INDEX_A < MAX_INDEX_A; INDEX_A++ )); do
    for (( INDEX_B = 0; INDEX_B < MAX_INDEX_B; INDEX_B++ )); do
        if (( ${A[$INDEX_A]} == ${B[$INDEX_B]} )); then
            echo + $INDEX_A $INDEX_B ${A[$INDEX_A]}
        else
            if (( LAST_NE != ${A[$INDEX_A]} )); then
                echo - $INDEX_A $INDEX_B ${A[$INDEX_A]} ${B[$INDEX_B]}
                LAST_NE=${A[$INDEX_A]}
            fi
        fi
    done
done
prostornet пишет:

У меня был вопрос возможно ли это решить без sort и uniq, с помощью циклов?

можно. Просто в нормальной жизни массивы просто так из ниоткуда не появляются как у вас.

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

38 (17.03.2014 15:06:41 отредактировано prostornet)

drBatty пишет:

можно. Просто в нормальной жизни массивы просто так из ниоткуда не появляются как у вас.

Вывод все равно не дает желаемого результата.


Хотел вот что (напримере вывода команды nmap -sP), показать все занятые и все свободные адреса)
./test.sh 192.168.1  :

#!/bin/bash

NET=$1

RED='\033[31m'
BLUBG='\033[44m'
NC='\033[0m'

TMP1=/tmp/ipchk1.tmp
TMP2=/tmp/ipchk2.tmp

rm -f ${TMP1}
rm -f ${TMP2}


/usr/bin/nmap -sP ${NET}.0/24 | sed -rn 's/.*[^0-9](([0-9]+\.){3})([0-9]+).*/\3/p' > ${TMP1}

b_ip=0
while read line; do
    array[$b_ip]="$line"
    b_ip=$(($b_ip+1))
    echo -e ${NET}.${RED}${line}${NC}
done < ${TMP1}

max_b=${#array[@]}
for (( ip=${max_b}; ip<=253; ip++ )); do
    array[$ip]=0
done

b=0
for (( i=1; i<=254 ; i++ )); do
    if (( ${array[$b]} != ${i} ));then
        echo -e ${NET}.${BLUBG}${i}${NC}
    else
        b=$(($b+1))
    fi
done

echo -e "В подсети ${NET}.0/24 занято: ${RED} ${max_b} ${NC} адреса(ов)."
echo -e "В подсети ${NET}.0/24 свободно: ${BLUBG} `expr 254 - ${max_b}` ${NC} адреса(ов)."

rm -f ${TMP1}
rm -f ${TMP2}

exit 0

Можно и проще наверно все написать.

P.S.:
причем вот эту часть скрипта пришлось дописывать, так как вылазила ошибка из за того что  индекс массива закончился

max_b=${#array[@]}
for (( ip=${max_b}; ip<=253; ip++ )); do
    array[$ip]=0
done

39

prostornet пишет:

Вывод все равно не дает желаемого результата.

что вам не нравится-то?

PS: ЯННП в вашем скрипт. Может вы его перепишете по-человечески? Это нормально, все так делают.

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

40 (17.03.2014 17:10:14 отредактировано prostornet)

Пардон, был не прав. Стоило сразу переписать...

#!/bin/bash

A=(2 10 11 54 69 101 155 156 199 202)


RED='\033[31m'
BLUBG='\033[44m'
NC='\033[0m'

MAX_INDEX_A=${#A[@]}

for (( INDEX_A=0; INDEX_A<=MAX_INDEX_A; INDEX_A++ )); do
    echo -e ${RED}${A[INDEX_A]}${NC}
done

for (( INDEX_A=${MAX_INDEX_A}; INDEX_A<=253; INDEX_A++ )); do
    A[$INDEX_A]=0
done

# Вместо массива B, использовал перебор цифр (в данном примере от 1 до 254)
INDEX_B=0
for (( i=1; i<=254 ; i++ )); do
    if (( ${A[$INDEX_B]} != ${i} ));then
        echo -e ${BLUBG}${i}${NC}
    else
        INDEX_B=$(($INDEX_B+1))
    fi
done

echo -e "Номеров в массиве А и В: ${RED} ${MAX_INDEX_A} ${NC}."
echo -e "Номеров только в массиве В: ${BLUBG} `expr 254 - ${MAX_INDEX_A}` ${NC}."

exit 0

41 (17.03.2014 17:08:31 отредактировано prostornet)

Или вот вариант с двумя массивами

#!/bin/bash

A=(2 10 11 54 69 101 155 156 199 202)

RED='\033[31m'
BLUBG='\033[44m'
NC='\033[0m'

MAX_INDEX_A=${#A[@]}

for (( INDEX_A=0; INDEX_A<=MAX_INDEX_A; INDEX_A++ )); do
    echo -e ${RED}${A[INDEX_A]}${NC}
done

for (( INDEX_A=${MAX_INDEX_A}; INDEX_A<=253; INDEX_A++ )); do
    A[$INDEX_A]=0
done

# массив B, числа от 1 до 254
for (( i=1; i<=254; i++ )); do
    B[$INDEX_B]="$i"
    INDEX_B=$(($INDEX_B+1))
done

MAX_INDEX_B=`expr ${#B[@]} - 1`

INDEX_A=0
for (( INDEX_B=0; INDEX_B<=MAX_INDEX_B; INDEX_B++ )); do
    if (( ${A[$INDEX_A]} != ${B[$INDEX_B]} ));then
        echo -e ${BLUBG}${B[$INDEX_B]}${NC}
    else
        INDEX_A=$(($INDEX_A+1))
    fi
done

echo -e "Номеров в массиве А и В: ${RED} ${MAX_INDEX_A} ${NC}."
echo -e "Номеров только в массиве В: ${BLUBG} `expr 254 - ${MAX_INDEX_A}` ${NC}."

exit 0

42

Массивы я беру из файлов (FILE_A и FILE_B):

while read LINE_A; do
         A[$INDEX_A]=${LINE_A}
         INDEX_A=$(($INDEX_A+1))
done < ${FILE_A}

while read LINE_B; do
         B[$INDEX_B]=${LINE_B}
         INDEX_B=$(($INDEX_B+1))
done < ${FILE_B}

43

prostornet пишет:

INDEX_B=$(($INDEX_B+1))

просто

(( INDEX_B++ ))
prostornet пишет:

MAX_INDEX_B=`expr ${#B[@]} - 1`

(( MAX_INDEX_B = ${#B[@]} - 1 ))

а ещё проще чуть ниже исправить <= на < (в заголовке цикла).

prostornet пишет:

Массивы я беру из файлов (FILE_A и FILE_B):

1. ну можно было их не брать, а прямо так обработать, в файлах. Ну ладно, это на потом.

2. временные файлы лучше так делать

TMP_FILE=$(mktemp)

создаётся временный файл в /tmp/, его потом надо удалить.

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

44

Спасибо за науку, на будущее учту.