Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

awk: catch `exit' in the END block

Tags:

awk

I'm using awk for formatting an input file in an output file. I have several patterns to fill variables (like "some pattern" in the example). These variables are printed in the required format in the END block. The output has to be done there because the order of appearance in the input file is not guaranteed, but the order in the output file must be always the same.

BEGIN {
    FS = "=|,"
}


/some pattern/ {
    if ($1 == 8) {
        var = $1
    } else {
        # Incorrect field value
        exit 1
    }
}

END {
    # Output the variables
    print var
}

So my problem is the exit statement in the pattern. If there is some error and this command is invoked, there should be no output at all or at the most an error message. But as the gawk manual (here) says, if the exit command is invoked in a pattern block the END block will be executed at least. Is there any way to catch the exit like:

if (!exit_invoked) {
    print var
}

or some other way to avoid printing the output in the END block?

Stefan

edit: Used the solution from shellter.

like image 844
Stefan Avatar asked Apr 12 '12 17:04

Stefan


1 Answers

you'll have to handle it explicitly, by setting exit_invoked before exit line, i.e.

BEGIN {
    FS = "=|,"
}


/some pattern/ {
    if ($1 == 8) {
        var = $1
    } else {
        # Incorrect field value
        exit_invoked=1
        exit 1
    }
}

END {
    if (! exit_invoked  ) {
        # Output the variables
        print var
    }
}

I hope this helps.

like image 108
shellter Avatar answered Oct 15 '22 13:10

shellter