Gen-sorted.awk line 19 error

gen-sorted.awk line 19 error

This page provides detailed documentation on the Picard command-line syntax and Whether to create a BAM index when writing a coordinate-sorted BAM file. Please help me on this. mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [) /[^ Thanks. UNIX file name v “The operating system error log facility” on page 19 You can redirect the output to a file with the -o flag and sort the output on.

Confirm. agree: Gen-sorted.awk line 19 error

Gen-sorted.awk line 19 error
Canon pixma mp150 error e5

Gen-sorted.awk line 19 error - can


One of the great things we can do in the shell is embed other programming languages within the body of our scripts. We have seen hints of this with the stream editor , and the arbitrary precision calculator program . By using the shell’s single quoting mechanism to isolate text from shell expansion, we can freely express other programming languages, provided we have a suitable language interpreter to execute them.

In this adventure, we are going to look at one such program, .


The AWK programming language is truly one of the classic tools used in Unix. It dates back to the very earliest days of the Unix tradition. It was originally developed in the late 1970’s at Bell Telephone Laboratories by Alfred Aho, Peter Weinberger, and Brian Kernighan. The name “AWK” comes from the last names of the three authors. It underwent major improvements in 1985 with the release of or “new awk.” It is that version that we still use today, though it is usually just called .


is a standard program found in most every Linux distribution. Two free/open source versions of the program are in common use. One is called (short for Mike’s awk, named for its original author, Mike Brennan) and (GNU awk). Both versions fully implement the 1985 standard as well as add a variety of extensions. For our purposes, either version is fine, since we will be focusing on the traditional features. In most distributions, the name is symbolically linked to either or .

So, What’s it Good For?

Though AWK is fairly general purpose, it is really designed to create filters, that is, programs that accept standard input, transform data, and send it to standard output. In particular, AWK is very good at processing columnar data. This makes it a good choice for developing report generators, and tools that are used to re-format data. Since it has strong regular expression support, it’s good for very small text extraction and reformatting problems, too. Like , many AWK programs are just one line long.

In recent years, AWK has fallen a bit out of fashion, being supplanted by other, newer, interpreted languages such as Perl and python, but AWK still has some advantages:

  • It’s easy to learn. The language is not overly complex and has a syntax much like the C programming language, so learning it will be useful in the future when we study other languages and tools.

  • It really excels at a solving certain types of problems.

How it Works

The structure of an AWK program is somewhat unique among programming languages. Programs consist of a series of one or more pattern and action pairs. Before we get into that though, let’s look at what the typical AWK program does.

We already know that the typical AWK program acts as a filter. It reads data from standard input, and outputs filtered data on standard output. It reads data one record at a time. By default, a record is a line of text terminated by a newline character. Each time a record is read, AWK automatically separates the record into fields. Fields are, again by default, separated by whitespace. Each field is assigned to a variable, which is given a numeric name. Variable $1 is the first field, $2 is the second field, and so on. $0 signifies the entire record. In addition, a variable named NF is set containing the number of fields detected in the record.

Pattern/action pairs are tests and corresponding actions to be performed on each record. If the pattern is true, then the action is performed. When the list of patterns is exhausted, the AWK program reads the next record and the process is repeated.

Let’s try a really simple case. We’ll filter the output of an command:

The AWK program is contained within the single quotes following the command. Single quotes are important because we do not want the shell to attempt any expansion on the AWK program, since its syntax has nothing to do with the shell. For example, represents the value of the entire record the AWK program read on standard input. In AWK, the means “field” and is not a trigger for parameter expansion as it is in the shell.

Our example program consists of a single action with no pattern present. This is allowed and it means that every record matches the pattern. When we run this command, it simply outputs every line of input much like the command.

If we look at a typical line of output from , we see that it consists of 9 fields, each separated from its neighbor by one or more whitespace characters:

Let’s add a pattern to our program so it will only print lines with more than 9 fields:

We now see a list of symbolic links in since those directory listings contain more than 9 fields. This pattern will also match entries with file names containing embedded spaces, since they too will have more than 9 fields.

Special Patterns

Patterns in AWK can have many forms. There are conditional expressions like we have just seen. There are also regular expressions, as we would expect. There are two special patterns called BEGIN and END. The BEGIN pattern carries out its corresponding action before the first record is read. This is useful for initializing variables, or printing headers at the beginning of output. Likewise, the END pattern performs its corresponding action after the last record is read from the input file. This is good for outputting summaries once the input has been processed.

Let’s try a more elaborate example. We’ll assume for the moment that the directory does not contain any file names with embedded spaces (though this is never a safe assumption). We could use the following script to list symbolic links:

In this example, we have 3 pattern/action pairs in our AWK program. The first is a BEGIN pattern and its action that prints the report header. We can spread the action over several lines, though the opening brace “{” of the action must appear on the same line as the pattern.

The second pattern tests the current record to see if it contains more than 9 fields and, if true, the 9th field is printed, followed by some text and the final field in the record. Notice how this was done. The NF variable is preceded by a “$”, thus it refers to the NFth field rather than the value of NF itself.

Lastly, we have an END pattern. Its corresponding action prints the “End Of Report” message once all of the lines of input have been read.


There are three ways we can run an AWK program. We have already seen how to embed a program in a shell script by enclosing it inside single quotes. The second way is to place the awk script in its own file and call it from the program like so:

Lastly, we can use the shebang mechanism to make the AWK script a standalone program like a shell script:

The Language

Let’s take a look at the features and syntax of AWK programs.

Program Format

The formatting rules for AWK programs are pretty simple. Actions consist of one or more statements surrounded by braces ({}) with the starting brace appearing on the same line as the pattern. Blank lines are ignored. Comments begin with a pound sign (#) and may appear at the end of any line. Long statements may be broken into multiple lines using line continuation characters (a backslash followed immediately by a newline). Lists of parameters separated by commas may be broken after any comma. Here is an example:


Here are the most common types of patterns used in AWK:


As we saw earlier, the BEGIN and END patterns perform actions before the first record is read and after the last record is read, respectively.


Relational expressions are used to test values. For example, we can test for equivalence:

or for relations such as:

It is also possible to perform calculations like:


AWK supports extended regular expressions like those supported by . Patterns using regular expression can be expressed in two ways. First, we can enclose a regular expression in slashes and a match is attempted on the entire record. If a finer level of control is needed, we can provide an expression containing the string to be matched using the following syntax:

expression ~ /regexp/

For example, if we only wanted to attempt a match on the third field in a record, we could do this:

From this, we can think of the “~” as meaning “matches” or “contains”, thus we can read the pattern above as “field 3 matches the regular expression ”.

pattern logical-operator pattern

It is possible to combine patterns together using the logical operators Means or in the context of a grouped match

For instance, the pattern (red) matches the word red and ordered but not any word that contains all three of those letters in another order (such as the word order).

Awk like sed with sub() and gsub()

Awk features several functions that perform find-and-replace actions, much like the Unix command sed. These are functions, just like print and printf, and can be used in awk rules to replace strings with a new string, whether the new string is a string or a variable.

The sub function substitutes the first matched entity (in a record) with a replacement string. For example, if you have this rule in an awk script:

{ sub(/apple/, "nut", $1);
    print $1}

running it on the example file colours.txt produces this output:


The reason both apple and pineapple were replaced with nut is that both are the first match of their records. If the records were different, then the results could differ:

$ printf"apple apple\npineapple apple\n" Previous sed -n's/^.*GNU ld.*/([0-9][0-9]*/.[0-9.]*\) .*$/\1/p'`

4594 case $ac_prog_version in

4595'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;

4596 2.1[3-9]* getline current_time close("date") print "Report printed on " current_time }

In this version of , none of the predefined variables are changed and the record is not split into fields. However, is set.

Using getline from a Coprocess

Reading input into from a pipe is a one-way operation. The command that is started with ‘’ only sends data to your program.

On occasion, you might want to send data to another program for processing and then read the results back. allows you to start a coprocess, with which two-way communications are possible. This is done with the ‘’ operator. Typically, you write data to the coprocess first and then read the results back, as shown in the following:

print "" awk gen-sorted.awk line 19 error {ttl+=$5; print $9 " ^" $5 " ^"$3} END{print "Total " ttl " bytes"}' </font>

Figure 17 is the output of Figure 16 and you will see that the total is printed as a final line after the last directory entry.

Figure 17

<font face="Courier"> store.dat 109 mjb store.sav 93 mjb store.txt 3058 mjb sort.dat 89 mjb sort.sav 193 mjb sort.txt 2068 mjb palet.txt 20 mjb Total 5640 bytes </font>

Figure 18 adds the use of the BEGIN key word and Figure 19 shows the output with the heading created with the BEGIN statement.

Figure 18

<font face="Courier"> ls gen-sorted.awk line 19 error getline var

Reads the next record from the output of command and assigns its contents to the variable var. Only var is set.

String Functions

As one would expect, AWK has many functions used to manipulate strings and what’s more, many of them support regular expressions. This makes AWK’s string handling very powerful.

gsub(r, s, t)

Globally replaces any substring matching regular expression r contained within the target gen-sorted.awk line 19 error t with the string s. The target string is optional. If omitted, is used as the target string. The function returns the number of substitutions made.

index(s1, s2)

Returns the leftmost position of string s2 within string s1. If s2 does not appear within s1, the function returns 0.


Returns the number of characters in string s.

match(s, r)

Returns the leftmost position of a substring matching regular expression r within string s. Returns 0 if no match is found. This function also sets the internal variables and .

split(s, a, fs)

Splits string s into fields and stores each field in an element of array a. Fields are split according to field separator fs. For example, if we wanted to break a phone number such as 800-555-1212 into 3 fields separated by the “-” character, we could do this:

After doing so, the array will contain the following elements:

sprintf(fmt, exprs)

This function behaves likeexcept instead of outputting a formatted string, it returns a formatted string containing the list of expressions to the caller. Use this function to assign a formatted string to a variable:

sub(r, s, t)

Behaves likeexcept only the first leftmost replacement is made. Likethe target string t is optional. If omitted, is used as the target string.

substr(s, p, l)

Returns the substring contained within string s starting at position p with length l.

Arithmetic Functions

AWK has the usual set of arithmetic functions. A word of caution about math in AWK: it has limitations in terms of both number size and precision of floating point operations. This is particularly true of. For tasks involving extensive calculation, would be preferred. The documentation provides a good discussion of the issues involved.

atan2(y, x)

Returns the arctangent of y/x in radians.


Returns the cosine of x, with x in radians.


Returns the exponential of x, that is e^x.


Returns the integer portion of x. For example if x = 1.9, 1 is returned.


Returns the natural logarithm of x. x must be positive.


Returns a random floating point value n such that 0 <= n < 1. This is a value between 0 and 1 where a value of 0 is possible but not 1. In AWK, gen-sorted.awk line 19 error, random numbers always follow the same sequence of values unless the seed for the random number generator is first set using the function (see below).


Returns the sine of x, gen-sorted.awk line 19 error, with x in radians.


Returns the square root of x.


Sets the seed for the random number generator to x. If x is omitted, then the time of day is used as the seed. To generate a random integer in the range of 1 to n, we can use code like this:

User Defined Functions

In addition to the built-in string and arithmetic functions, AWK supports user-defined functions much like the shell. The mechanism for passing parameters is different, and more like traditional languages such as C.

Defining a function

A typical function definition looks like this:

We use the keyword followed by the name of the function to be defined, gen-sorted.awk line 19 error. The name must be immediately followed by the opening left parenthesis of the parameter list. The parameter list may contain zero or more comma-separated parameters. A brace delimited code block follows with one or more statements. To specify what is returned by the function, the statement is used, followed by an expression containing the value to be returned. If we were to convert our previous dice rolling example into a function, it would look like this:

Further, if we wanted to generalize our function to support different possible maximum values, we could code this:

and then change to make use of our generalized function:

Passing Parameters to Functions

As we saw in the example above, we pass parameters to the function, and they are operated upon within the body of the function. Parameters fall into two general classes. First, there are the scalar variables, such as strings and numbers, gen-sorted.awk line 19 error. Second are the arrays. This distinction is important in AWK because of the way that parameters are passed to functions. Scalar variables are passed by value, meaning that a copy of the variable is created and given to the function. This means that scalar variables act as local variables within the function and are destroyed once the function exits. Array variables, on the other hand, gen-sorted.awk line 19 error, are passed by reference meaning that a pointer to the array’s starting position in memory is passed to the function. This means that the array is not treated as a local variable and that any change made to the array persists once the program exits the function, gen-sorted.awk line 19 error. This concept of passed by value versus passed by reference shows up in a lot of programming languages so it’s important to understand it.

Local Variables

One interesting limitation of AWK is that we cannot declare local variables within the body of a function. There is a workaround for this problem. We can add variables to the parameter list. Since all scalar variables in the parameter list are passed by value, they will be treated as if they are local variables. This does not apply to arrays, since they are always passed by reference. Unlike many other languages, AWK does not enforce the parameter list, thus we can gen-sorted.awk line 19 error parameters that gen-sorted.awk line 19 error not used by the caller of the function. In most other languages, the number and type of parameters passed during a function call must match the parameter list specified by the function’s declaration.

By convention, additional parameters used as local variables in the function are preceded by additional spaces in the parameter list like so:

These additional spaces have no meaning to the language, they are there for the benefit of the human reading the code.

Let’s try some short AWK programs on some numbers. First we need some data. Here’s a little AWK program that produces a table of random integers:

If we store this in a file, we can run it like so:

And it should produce a file containing 100 rows of 5 columns of random integers.

Convert a File Into CSV Format

One of AWK’s many strengths is file format conversion. Here we will gen-sorted.awk line 19 error our neatly arranged columns of numbers into a CSV (comma separated values) file.

This is a very easy conversion. All we need to do is change the output field separator () and then print all of the individual fields. While it is very easy to write a CSV file, gen-sorted.awk line 19 error, reading one can be tricky. In some cases, applications that write CSV files (including many gen-sorted.awk line 19 error spreadsheet programs) will create lines like this:

Notice the embedded comma in the second field. This throws the simple AWK solution () out the window. Parsing this kind of file can be done (, in fact has a language extension for this problem), but it’s not pretty. It is best to avoid trying to read this type of file.

Convert a File Into TSV Format

A frequently available alternative to the CSV file is the TSV (tab separated value) file. This file format uses tab charachers as the field separators:

Again, writing these files is easy to do. We just set the output field separator to a tab character. In regards to reading, most applications that write CSV files can also write TSV files. Using TSV files avoids the embedded comma problem we often see when attempting to read CSV files.

Print the Total for Each Row

If all we need to do is some simple addition, this is easily done:

Print the Total for Each Column

Adding up the column is pretty easy, too. In this example, we use a loop and array to maintain running totals for each of the five columns in our data file:

Print the Minimum and Maximum Value in Column 1

One Last Example

For our last example, we’ll create a program that processes a list of pathnames and extracts the extension from each file name to keep a tally of how many files have that extension:

To find the 10 most popular file extensions in our home directory, we can use the program like this:

Summing Up

We really have to admire what an elegant and useful tool the authors of AWK created during the early days of Unix. So useful that its utility continues to this day. We have given AWK a brief examination in this adventure. Feel free to explore further by delving deeper into the documentation of the various AWK implementations. Also, searching the web for “AWK one-liners” will reveal many useful and clever tricks possible with AWK.

Further Reading

Top \
awk-e'sub(/apple/, "nut")'
nut apple
pinenut apple

The gsub command substitutes all matching items:

$ printf"apple apple\npineapple apple\n" (\"[^\"]+\")"

Putting this to use, here is a simple program to parse the data:

BEGIN { FPAT = "([^,]+) awk ' \ <- use the backslash to force a continuation {ttl+=$5; \ <- on each line print $9 " ^" $5 " ^"$3 " ^Total " ttl " bytes"} \ ' <- until the final closure, then press enter </font>

A running total is fine, but what I really wanted here was a total bytes count at the end of the listing.

Although the awk default is to perform all commands on each record, awk also allows actions to be performed before the first record is read, and/or after the last record is processed. Commands to be executed at the beginning or end of the records are set off by the key words BEGIN and END. Figure 16, is an example of the END key word. The values in field $5 gen-sorted.awk line 19 error still accumulated in the ttl variable, but the total in ttl is printed as part of the END action instead of with each record.

Figure 16

<font face="Courier"> ls -l gen-sorted.awk line 19 error


Leave a Comment