Сравните каждую строку файла1 с каждой строкой файла2

mdadm --add откажется работать на уже смонтированном блочном устройстве. (Я не проверял, что это полностью предотвращает потерю данных :).

Однако он не проверяет наличие существующей файловой системы, отличной от -RAID. Он также не сравнивает идентификаторы RAID UUID в разделах RAID.

Не забывайте соблюдать осторожность при использованииmdadm --add:). Точно так же, как и с... почти любой другой командой, которую вы запускаете с привилегиями root.

0
11.01.2020, 05:53
4 ответа

Я написал для вас простой скрипт на Python, который сделает это:

address1 = input("Enter first file address:\n")
address2 = input("Enter second file address:\n")

data1 = []
data2 = []
with open(address1) as file:
    data1 = file.read().split('\n')

with open(address2) as file:
    data2 = file.read().split('\n')

if data1[-1] == "": data1.pop()
if data2[-1] == "": data2.pop()

for i in data1:
    for j in data2:
        if i.split(' ')[1].strip() == j.split(' ')[1].strip():
            print(i + ' ' + j)

1
28.01.2020, 02:29

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

while read i
do
 c1_array=( $i )
 string1=${c1_array[1]}
 while read j
 do
   c2_array=( $j )
   string2=${c2_array[1]}
   if [ $string1 = $string2 ]
   then
    echo "$i    $j"
   fi
 done < c2.log
done < c1.log
-1
28.01.2020, 02:29

Или, если ваши файлы отсортированы по-k2

join -j2 -o 1.1 1.2 2.1 2.2 c1.log c2.log

Выход:

D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
1
28.01.2020, 02:29

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

$ join -j 2 c1.log c2.log
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E1W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E2W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F1W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F2W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F4W

Что дает вам совпадение и первый столбец c1 и c2 в одной строке. Join требует, чтобы входные файлы были отсортированы. Если их нет, вы можете отсортировать их на лету:
join -j2 <(sort c1.log) <(sort c2.log). Это магия оболочки -. <( some command )будет выглядеть как файл для joinили любой другой команды, которой нужен файл.

Обработаем их дальше:

$ join -j 2 c1.log c2.log | while read match c1 c2; do printf '%s %s\t%s %s\n' $c1 $match $c2 $match; done
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F4W /u02/app/oracle/db/ggs/current/dirdat/ff

Готово!

Здесь команды красиво упакованы, поэтому при необходимости вы можете вставить их в скрипт:

join -j 2 c1.log c2.log \
| while read match c1 c2; do 
  printf '%s %s\t%s %s\n' "$c1" "$match" "$c2" "$match"
done

Если вам не нужна табуляция между двумя частями @bu5hman найдет лучший ответ .

Обновление:
Вы также можете получить соединение для вставки вкладок :join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)Пробел после -t'— буквальная табуляция. Нажмите Ctrl+V, затем TAB для этого. Плюс я делаю встроенную сортировку файлов.

$ join -t'      ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E1W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E2W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E3W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F1W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F2W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F3W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F4W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E1W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E2W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E3W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F1W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F2W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F3W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F4W /u02/app/oracle/db/ggs/current/dirdat/ff
1
28.01.2020, 02:29

Теги

Похожие вопросы