awk operation to get table formatted file

I need to parse .conf file in Unix system to get output from the snippets like below :

[sub_suffix-324]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()

I interested specifically about below lines:

[sub_suffix-324]
exten => int,1,GoSub(mdc_template-3,s,1)
exten => ext,1,GoSub(mdc_template-3,s,1) 

to get output to another file as below:

Extension   int_voicemail   ext_voicemail

324            yes(if int exist)                yes(if ext exist)

My initial awk script :

#!/usr/bin/awk -f

/^\[sub_suffix-/ {

  print $0
  next
}

/mdc_template/ {
print substr($3,1,3)
next
}

And the output like:

[sub_suffix-324]
int
ext
[sub_suffix-424]
int
ext
[sub_suffix-321]
[sub_suffix-3245]
ext
[sub_suffix-7435]
[sub_suffix-123]
[sub_suffix-325]
int
ext

but i need something like:

324
int
ext
424
int
ext
321
null
null
3245
null
ext
7435
null
null
123
null
null
325
int
ext

then format this as:

extension  int_mail    ext_mail
324           yes           yes
424           yes           yes
321           null           null
.
.
.
.

Any help is appreciated :slight_smile:

Thanks
cheecky

Making some wild guesses about an input file that produces the intermediate files you said you wanted, and writing a simple awk script that goes straight from the input file to the output you said you wanted (without creating intermediate files), you might want to try something like:

awk '
BEGIN {	FS = "[] ,-]"
	OFS = "\t"
	print "Extension", "int_mail", "ext_mail"
	OFS = OFS OFS
}
function ext_print() {
	if(e)	print e, f["int"], f["ext"]
	e = $2
	f["ext"] = f["int"] = "null"
}
/^[[]sub_suffix/ {
	ext_print()
	next
}
/mdc_template/ {
	f[$3] = "yes"
}
END {	ext_print()
}' file

If the file named file contains:

[sub_suffix-324]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-424]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-321]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-3245]
; generated by mod_identity
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-7435]
; generated by mod_identity
exten => int,n(next_380),Return()
; default action for busy
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-123]
; generated by mod_identity
exten => int,n(next_380),Return()
; default action for busy
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-325]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
eaten => ext,n(back),Return()

it produces the output:

Extension	int_mail	ext_mail
324		yes		yes
424		yes		yes
321		yes		null
3245		null		yes
7435		null		null
123		null		null
325		yes		yes

If you want to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awik or nawk .

cat cheecky.conf
[sub_suffix-324]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-424]
; generated by mod_identity
exten => int,1,GoSub(mdc_template-3,s,1)
exten => int,n(next_380),Return()
; default action for busy
exten => ext,1,GoSub(mdc_template-3,s,1)
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
[sub_suffix-321]
; generated by mod_identity
exten => int,n(next_380),Return()
; default action for busy
exten => ext,n,Set(PRI_CAUSE=17)
exten => ext,n,HangUp(17)
exten => ext,n(back),Return()
#!/usr/bin/env perl -w
# cheecky.pl
use strict;

my @suf = ("extension", "int_mail", "ext_mail");
while (<>) {
    if( /^\[sub_suffix-(\d+)\]$/ ){
        if ( $suf[0] ){
            display();
            @suf = (undef, "null", "null");
        }
        $suf[0] = $1;
    }
    else {
        /int,.,GoSub/ and $suf[1] = "yes" and next;
        /ext,.,GoSub/ and $suf[2] = "yes";
    }
}
display();

sub display {
    printf "%9s\t%8s\t%8s\n", $suf[0], $suf[1], $suf[2];
}
perl cheecky.pl cheecky.conf
extension       int_mail        ext_mail
      324            yes             yes
      424            yes             yes
      321           null            null