#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, пожалуйста, не удаляйте эту ветку, на этот вопрос был дан ответ согласно вопросу. Скорее откройте новую тему / вопрос и укажите там полную информацию для примера ввода и ожидаемого результата, а затем дайте мне знать.