проблема с awk для разбора текстового файла

#unix #awk

#unix #awk

Вопрос:

Я только начал изучать, как использовать awk для синтаксического анализа и печати текстового файла.

Я начал с приведенного ниже кода, кто может мне помочь?

ПРИМЕЧАНИЕ: в выходном файле обязательны кавычки (см. желаемый результат)

  awk '/^IPDATA=/ amp;amp; /A|B|C| '{print "ADD IP ="$0"n(n  Ref "$1",Type vlan="$2""n)n"}' file > file1 
  

ПРИМЕЧАНИЕ: Ref — это сумма строк IPREF здесь, в примере, у нас есть три : [2] amp;amp; [2] amp;amp; [1].

образец текстового файла на самом деле огромен, но я суммировал его :

 IPDATA=A                IPID A            
IPDATA=A                IPREF   [2] =     
--- IPREF = VRID=A_1                      
--- IPREF = VRID=A_2                      
                                          
IPDATA=B                IPID B            
IPDATA=B                IPREF   [2] =     
--- IPREF = VRID=B_1                      
--- IPREF = VRID=B_2                      
                                          
IPDATA=C               IPID C             
IPDATA=C               IPREF    [1] =     
--- IPREF = VRID=C_1                      
  

Я хочу получить следующий результат :

 "ADD IP=A "
( Ref  2
"Type vlan=VRID=A_1" 
"Type vlan=VRID=A_2" 
)
"ADD IP=B "          
( Ref  2              
"Type vlan=VRID=B_1" 
"Type vlan=VRID=B_2" 
)
"ADD IP=C "          
( Ref  1              
"Type vlan=VRID=C_1" 
)  

                 
  

Спасибо

Комментарии:

1. Пожалуйста, не редактируйте старые вопросы с ответами. Скорее открывайте новые с полной информацией и спасибо за ваши усилия.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными примерами только в GNU awk .

 awk -v s1=""" '
/^IPDATA/ amp;amp; /IPID .*/{
  if(FNR>1){  print ")"  }
  print s1 "ADD IP" s1 "="s1 $NF OFS s1
  next
}
/^IPDATA.*IPREF.*[[0-9] ]/{
  match($0,/[[^]]*/)
  print "( Ref sum of IPREF " substr($0,RSTART 1,RLENGTH-1)
  next
}
/^--- IPREF/{
  print s1 "Type vlan="$NF s1
}
END{
  print ")"
}
' Input_file
  

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

 awk -v s1=""" '                                               ##Starting awk program from here.
/^IPDATA/ amp;amp; /IPID .*/{                                        ##Checking condition if line starts IPDATA and having IPID here.
  if(FNR>1){  print ")"  }                                     ##Checking condition if FNR>1 then printing ) here.
  print s1 "ADD IP" s1 "="s1 $NF OFS s1                        ##Printing s1 ADD IP s1 equal to s1 last field OFS and s1 here.
  next                                                         ##next will skip all further statements from here.
}
/^IPDATA.*IPREF.*[[0-9] ]/{                                  ##Checking condition if line starts from IPDATA and having IPREF till [ digits ].
  match($0,/[[^]]*/)                                          ##Using match to match from [ till ] in line.
  print "( Ref sum of IPREF " substr($0,RSTART 1,RLENGTH-1)    ##printing string as per request and sub-string from RSTART 1 to till RLENGTH-1 here.
  next
}
/^--- IPREF/{                                                  ##Checking conditon if line starts from --- IPREF then do following.
  print s1 "Type vlan="$NF s1                                  ##Printing s1 string last field and s1 here.
}
END{                                                           ##Starting END block of this program from here.
  print ")"                                                    ##Printing ) here.
}
' Input_file                                                   ##Mentioning Input_file name here.
  

Комментарии:

1. извините за мой поздний ответ, проблема не устранена, когда я запускаю скрипт, ничего не отображается, выходной файл пуст

2. @azzoudino32, Запустите его на терминале, не выводя выходные данные в файл, тогда что он показывает?

3. @azzoudino32, это не та команда, которую я дал, не уверен, почему вы запускаете эту

4. @azzoudino32, пожалуйста, откройте новый вопрос, поскольку редактирование вопросов слишком поздно в SO не рекомендуется, пожалуйста, откройте новый вопрос и дайте мне знать тогда.

5. @azzoudino32, пожалуйста, не удаляйте эту ветку, на этот вопрос был дан ответ согласно вопросу. Скорее откройте новую тему / вопрос и укажите там полную информацию для примера ввода и ожидаемого результата, а затем дайте мне знать.