Не могли бы вы попробовать следующее (протестировано и написано в GNU awk
).
awk '
BEGIN{
OFS=" , "
}
match($0,/COL[0-9]+: [^,]*/){
val=substr($0,RSTART,RLENGTH)
match($0,/NAME[^,]*/)
print val OFS substr($0,RSTART,RLENGTH)
val=""
}
' Input_file
Я забил совпадение (я) строки COL
и NAME
в каждой строке, поэтому, если в строке нет строки COL
, она может ничего не печатать.
В случае, если строка COL
не найдена в строке, и вы все еще хотите напечатать NAME
соответствие строки, попробуйте выполнить следующее.
awk '
BEGIN{
OFS=" , "
}
match($0,/COL[0-9]+: [^,]*/){
val=substr($0,RSTART,RLENGTH)
}
match($0,/NAME[^,]*/){
if(val){
printf "%s%s",val,OFS
}
print substr($0,RSTART,RLENGTH)
}
' Input_file
Объяснение: Добавление пояснения к вышеприведенному коду.
awk ' ##Starting awk program heer.
BEGIN{ ##Starting BEGIN section for awk code here.
OFS=" , " ##Setting OFS output field separator as space comma space here.
} ##Closing BEGIN section here.
match($0,/COL[0-9]+: [^,]*/){ ##Using match of awk OOTB function to match a REGEX string COL till comma here.
val=substr($0,RSTART,RLENGTH) ##If a match is foundthen creating variable val whose value is sub string of matched regex starting to till end value of it.
match($0,/NAME[^,]*/) ##Again using match to match string from NAME to till next comma comes.
print val OFS substr($0,RSTART,RLENGTH) ##Printing value of variable val OFS and substring of current line whose sarting point is RSTART and end point is RLENGTH.
val="" ##Nullifying variable val here.
}
' Input_file ##Mentioning Input_file name here.
Добавление ссылки со страницы man awk
:
RSTART The index of the first character matched by match(); 0 if no match. (This implies that character indices start at one.)
RLENGTH The length of the string matched by match(); -1 if no match.