Как выбрать два столбца из awk и распечатать, если они не совпадают - PullRequest
3 голосов
/ 13 марта 2019

Мне нужно выбрать два значения MSISDN из журналов миграции учетной записи OMO и распечатать те, которые не совпадают.

[2019-03-11 04:15:08 INFO-SUBAPP ESBRestClient:117] ## IP-103.228.158.85##TOKEN-201903110416276787774(**923419606907**)RESPONSE-BODY: {"callStatus":"false","responseCode":"18","description":"OMO account migration – **923481057772**"}

[2019-03-11 04:24:02 INFO-SUBAPP ESBRestClient: 117] ## IP-119.153.134.128 ## TOKEN-1552260212780839 (923214748517) RESPONSE-BODY: {"callStatus": "false", " responseCode ":" 18 "," description ":" Миграция учетной записи OMO - 953214748517 "}

923481057772 - это старый MSISDN.

923419606907 - это новый MSISDN, и мне нужно сохранить его в новом файле. Я использовал следующую команду для выбора только нового MSISDN:

cat migration.txt | egrep "OMO account migration" | egrep "responseCode\":\"1700" | awk -F"(" '{gsub(/\).*/,"",$2);print $2}' >>newmsisdn.txt

Я использую сохраненные значения msisdn для получения номера токена. Затем я использую эти токены для получения нескольких параметров. Окончательный результат выглядит примерно так:

Дата Время Старый MSISDN Новый MSISDN Старый профиль Новый профиль CNIC Статус учетной записи Статус учетной записи Миграционный канал (До после) 2019-03-11 | 00:00:14 | 923135260528 | 923029403541 | OMO BVS MA | 0 | 1620221953175 | АКТИВНЫЙ | | SubApp

2019-03-11 | 00:00:14 | 923135260528 | 923003026654 | OMO BVS MA | 0 | 1620221953175 | АКТИВНЫЙ | | SubApp

2019-03-11 | 00:00:14 | 923135260528 | 923003026654 | OMO BVS MA | 0 | 1620221953175 | АКТИВНЫЙ | | SubApp

2019-03-11 | 00:00:14 | 923135260528 | 923038048244 | OMO BVS MA | 0 | 1620221953175 | АКТИВНЫЙ | | SubApp

Во втором экземпляре журнала эти два значения одинаковы. Мне нужно отфильтровать их, т. Е. Мне нужно использовать только несоответствующие значения. Как сравнить два несоответствующих значения и напечатать новый MSISDN?

Ответы [ 3 ]

5 голосов
/ 13 марта 2019

Ответ на первый вариант вопроса

Попытка:

awk -F'[*][*]' '/OMO account migration/ && /responseCode":"18"/ && $2 != $4 { print $2}' migration.txt

Избегает необходимости порождать несколько процессов и соединять их с конвейерами. Это делает этот подход сравнительно эффективным.

Как это работает

  • -F'[*][*]'

    Это устанавливает в качестве разделителя поля две звезды. Таким образом, новый MSISDN является полем 2, а старый - полем 4.

  • /OMO account migration/ && /responseCode":"18"/ && $2 != $4 { print $4}

    Выбирает для строк, которые (1) содержат регулярное выражение OMO account migration/ и (2) содержат регулярное выражение responseCode":"18" и (3) имеют второе поле, отличное от четвёртый. Для любой такой строки печатается второе поле.

Пример * * 1 032 Давайте рассмотрим этот тестовый файл из трех строк: $ cat migration.txt [2019-03-11 04:15:08 INFO-SUBAPP ESBRestClient:117] ## IP-103.228.158.85##TOKEN-201903110416276787774(**923419606907**)RESPONSE-BODY: {"callStatus":"false","responseCode":"18","description":"OMO account migration – **923481057772**"} [2019-03-11 04:15:08 INFO-SUBAPP ESBRestClient:117] ## IP-103.228.158.85##TOKEN-201903110416276787774(**923419606888**)RESPONSE-BODY: {"callStatus":"false","responseCode":"19","description":"OMO account migration – **923481057999**"} [2019-03-11 04:15:08 INFO-SUBAPP ESBRestClient:117] ## IP-103.228.158.85##TOKEN-201903110416276787774(**923419606123**)RESPONSE-BODY: {"callStatus":"false","responseCode":"18","description":"OMO account migration – **923419606123**"} Давайте запустим нашу команду: $ awk -F'[*][*]' '/OMO account migration/ && /responseCode":"18"/ && $2 != $4 {print $2}' migration.txt >>newmsisdn.txt Выходной файл теперь содержит один новый MSISDN, который нам нужен: $ cat newmsisdn.txt 923419606907

0 голосов
/ 13 марта 2019

Я бы выбрал следующий подход: я вижу, что каждый номер MSISDN содержит двенадцать цифр ([0-9]), расположенных между двумя двойными звездочками.
Вы можете найти те, которые используют следующее регулярное выражение:

grep -o "\*\*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\*\*"

Если ваша система поддерживает это, вы можете упростить это до:

grep -o "\*\*[0-9]{12}\*\*"

Если у вас есть такие, вы можете использовать awk, чтобы показать, что они разные, что-то вроде:

'{IF ($1 != $2) PRINT $1 $2}' (not tested).
0 голосов
/ 13 марта 2019

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

awk '
/OMO account migration/ && /responseCode":"18"/{
  val_old=val_new=""
  match($0,/\*\*[0-9]+\*\*/)
  val_old=substr($0,RSTART,RLENGTH)
  $0=substr($0,RSTART+RLENGTH)
  match($0,/\*\*[0-9]+\*\*/)
  val_new=substr($0,RSTART,RLENGTH)
}
(val_old!=val_new){
  gsub("*","",val_new)
  print val_new
}
'   Input_file

Объяснение: Добавление подробного объяснения для вышеприведенного кода.

awk '                                                     ##Starting awk program here.
/OMO account migration/ && /responseCode":"18"/{          ##Checking condition if a line contains strings OMO account migration AND responseCode":"18" in it then do following.
  val_old=val_new=""                                      ##Nullifying variables val_old and val_new here.
  match($0,/\*\*[0-9]+\*\*/)                              ##Using match OOTB function of awk to match from **digits** here. If match found then value of RSTART and RLENGTH(awk variables) will be SET.
  val_old=substr($0,RSTART,RLENGTH)                       ##Creating variable val_old which is substring of starting point as RSTART and ending point of RLENGTH here.
  $0=substr($0,RSTART+RLENGTH)                            ##Re-defining value of current line with substring whose value starts after matched regexs next index, so that we can catch new value in next further statements.
  match($0,/\*\*[0-9]+\*\*/)                              ##Using match OOTB function of awk to match from **digits** here. If match found then value of RSTART and RLENGTH(awk variables) will be SET(2nd time run).
  val_new=substr($0,RSTART,RLENGTH)                       ##Creating variable named val_new whose value is substring of current line startpoint is RSTART and ending point is RLENGTH here.
}                                                         ##Closing BLOCK for string matching condition here.
(val_old!=val_new){                                       ##Checking condition ig val_old variable is NOT equal to val_new then do following.
  gsub("*","",val_new)                                    ##Globaly subsituting * in val_new to get exact value as per OP need.
  print val_new                                           ##Printing val_new value here.
}
'  Input_file                                             ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...