Ошибка загрузки сервера Ubuntu 16.04 / черный экран

Как я уже упоминал в комментариях к вопросу, я нашел несколько простое решение awk: объединить два числа для создания одной длинной строки, заменить все точки пробелом (чтобы разрешить использование пространства в качестве поля по умолчанию разделитель в awk) и перейдите в поле сравнения строк с файлом + половина.

Основная команда

printf ${a[1]}${a[2]} | awk '{gsub("\\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x };}'

Я тестировал это с помощью gawk и mawk, работал в обоих.

Здесь вывод с первым примером (.1.3.6.1.4.1.232.13600256 и .1.3.6.1.4.1.232.13600276):

$ printf ${a[1]}${a[2]} | awk '{gsub("\\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x };}'
.1.3.6.1.4.1.232

Базовая команда [!d2 ]

Если вы хотите одновременно сравнить несколько строк, объедините их вместе и разделите с помощью новой строки в printf, затем добавьте printf в конце команды awk следующим образом:

[ f8]

Выход:

$ printf "${a[1]}${a[2]}\n${a[3]}${a[4]}" | awk '{gsub("\\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}'
.1.3.6.1.4.1.232 # same for a[1] and a[2]
.1.3.6.1.4.1.759 # same for a[3] and a[4]

Ограничение вывода

Теперь комментарий kos надлежащим образом заметил, что OP хочет отображать только 7 номеров. Для этого вы можете добавить канал в команду cut -d'.' -f1-8. Например:

printf "${a[5]}${a[6]}" | mawk '{gsub("\\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8

Вот пример вывода из моего терминала:

$ a[5]=.1.3.6.1.4.1.232.13600256.885


$ a[6]=.1.3.6.1.4.1.232.13600256.885


$ printf "${a[5]}${a[6]}" | mawk '{gsub("\\."," "); half=NF/2}; { for ( x=1; x<=half; x++ ) { if ( $x==$(x + half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8
.1.3.6.1.4.1.232.13600256.885


 half) ) printf "."$x }; printf "\n"}' | cut -d'.' -f1-8                      <
.1.3.6.1.4.1.232

Ограничение вывода [!d16 ]

Опять же, все можно поместить в awk-скрипт

#!/usr/bin/awk -f

{
 gsub("\\."," "); 
 half=NF/2
}; 

{ 
 for ( x=1; x<=half; x++ ) { 
    if ( $x==$(x + half) ) printf "."$x 
  }; 
  printf "\n"
}

Пример прогона:

$ printf "${a[5]}${a[6]}" | num-comp.awk | cut -d'.' -f1-8                     
.1.3.6.1.4.1.232

Сравнение с первым не равным числом

Awk имеет очень полезную функцию substr(string,X,Y), которая позволяет разрезать или «обрезать» строку, начиная с первого символа (x) и заканчивая (Y). Поэтому, зная это, давайте возьмем два числа как два поля одной строки и пропустим их через цикл. Мы будем продолжать увеличивать длину подстроки (начало до конца), пока они не станут равными. Когда мы сталкиваемся с неравными подстроками, мы выходим и печатаем последнюю известную равную подстроку.

echo ".1.3.6.1.4.1.232.13600256\t.1.3.6.1.4.1.232.13600276" | awk 'BEGIN{i=1}{ while(substr($1,1,i)==substr($2,1,i)){var=substr($1,1,i);i++};} END{print var}'

Особая благодарность terdon за предложение использования функции substr, которую я ранее делал даже не существовало

0
задан 18 April 2018 в 08:59

0 ответов

Другие вопросы по тегам:

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