awk without printing newline
Categories:
Mastering AWK: Suppressing Newlines for Concise Output

Learn how to control newline characters in AWK output, enabling you to produce single-line results, concatenate fields, and format data precisely for various scripting needs.
AWK is a powerful text processing tool often used for data extraction and reporting. By default, AWK prints a newline character after each print
statement. While this behavior is usually desired, there are many scenarios where you need to suppress this automatic newline, such as concatenating fields on a single line, building custom output formats, or creating CSV/TSV files without extra line breaks. This article will guide you through the techniques to achieve newline suppression in AWK, providing practical examples and explanations.
The Default Behavior of AWK's print
Statement
Before diving into newline suppression, it's crucial to understand how AWK's print
statement works by default. When you use print
with one or more arguments, AWK concatenates these arguments, separated by the Output Field Separator (OFS), and then appends the Output Record Separator (ORS), which is a newline character by default. This results in each print
statement producing a new line of output.
echo "apple banana cherry" | awk '{print $1, $2; print $3}'
Default AWK print behavior, each print statement adds a newline.
The output of the above command would be:
apple banana
cherry
Notice how apple banana
and cherry
appear on separate lines due to the default ORS
.
Method 1: Using a Comma to Suppress Newlines
The simplest way to suppress the newline after a print
statement is to follow the last argument with a comma. When a comma is used at the end of a print
statement, AWK will not append the ORS
(newline) to the output. Instead, it will append the OFS
(space by default), allowing subsequent print
statements to continue on the same line.
echo "one two three four" | awk '{print $1, $2,; print $3, $4}'
Using a trailing comma to suppress newline after the first print.
The output will be:
one two three four
Here, the comma after $2
in the first print
statement prevents a newline, causing $3, $4
to be printed on the same line. This method is particularly useful when you want to build a line incrementally.
OFS
(usually a space), not nothing. If you need absolutely no separator, you might need to concatenate strings directly.Method 2: Concatenating Strings Directly
Another effective way to avoid newlines is to concatenate strings and variables directly within a single print
statement without using commas between them. When items are concatenated without commas, AWK treats them as a single string, and no OFS
is inserted between them. The ORS
will only be appended once at the very end of the print
statement.
echo "data1 data2 data3" | awk '{print $1 $2 $3}'
Concatenating fields directly without spaces.
This will produce:
data1data2data3
If you need spaces or other delimiters, you must explicitly include them as string literals:
echo "data1 data2 data3" | awk '{print $1 "-" $2 "-" $3}'
Concatenating fields with custom delimiters.
Output:
data1-data2-data3
Method 3: Modifying the Output Record Separator (ORS)
For more global control, you can change the ORS
(Output Record Separator) variable. By default, ORS
is set to "\n"
(newline). If you set ORS
to an empty string ""
, AWK will not append any character after each print
statement. This is useful when you want to process an entire file and output everything on a single line, or when you want to manually control all line breaks.
echo -e "line1\nline2\nline3" | awk 'BEGIN {ORS=""} {print $0}'
Setting ORS to an empty string to remove all newlines.
The output will be:
line1line2line3
If you want to print each record on a single line but without the default newline between fields, you might combine ORS=""
with a trailing comma in print
statements, or concatenate fields directly.
flowchart TD A[Start AWK Script] --> B{Is a newline desired after print?} B -- Yes --> C[Default: print arguments, then ORS (newline)] B -- No --> D{Is incremental line building needed?} D -- Yes --> E[Use trailing comma: print arguments, then OFS] D -- No --> F{Is global newline suppression needed?} F -- Yes --> G[Set ORS="": print arguments, no ORS] F -- No --> H[Concatenate strings directly: print "string1" "string2"] C --> I[End] E --> I G --> I H --> I
Decision flow for suppressing newlines in AWK.
Practical Applications and Examples
Understanding these methods allows for flexible output formatting. Here are a few common scenarios:
# Example 1: Printing specific fields on one line, separated by a custom delimiter
echo "Name:Alice Age:30 City:NY" | awk '{print $1 "_" $2 "_" $3}'
# Example 2: Building a line incrementally with a trailing comma
echo "Item1 100\nItem2 200" | awk '{print $1 ":"; print $2 " "; next} END {print "Total"}'
# Example 3: Removing all newlines from a file
cat /etc/passwd | awk 'BEGIN {ORS=""} {print $0}'
Various practical examples of newline suppression in AWK.
ORS=""
globally, as it will affect all print
statements in your script. If you need newlines in some parts of your output but not others, use the trailing comma or direct concatenation methods instead.By mastering these techniques, you gain fine-grained control over AWK's output, making it an even more versatile tool for your scripting arsenal. Choose the method that best fits your specific formatting requirements.