How to Format Number in Bash [6 Cases]

The printf command is the default choice to format number in Bash. It offers multiple format specifiers such as %d and %f to format integer and floating point numbers. Moreover, there are many external tools available in Bash to format numbers. Tools like awk are easy to use and provide greater flexibility. This article discusses various aspects of formatting numbers using printf and other utilities.

1. Zero Padding Numbers for Consistent Length in Bash

For padding numbers with zeros to achieve fixed length, make the proper use of the printf command. This command works to pad single or multiple numbers and numbers including integers or floating points.

Format Integer Number With Leading Zeros Using “printf” Command

The “%d” format specifier of printf command is useful for formatting integer numbers. It is quite easy to maintain a fixed length of integer numbers by adding leading zeros. For instance, consider a number 42. To add two leading zeros to make the number a fixed length of four digits:

num=42
printf "%04d\n" $num
EXPLANATION

“%04d” is the format specifier used for formatting the number stored in the num variable. Here-

%: Indicates the beginning of the format specifier.

0: Specifies that padding should be done with zeros.

4: Indicates the minimum width of the field. In this case, it says that the number should be at least four characters wide.

d: Specifies that the argument is an integer.

\n: Adds a newline character after printing the formatted number, making the output appear on a new line.

Adding leading zeros to integer number in BashThe command prints 0042 by adding two leading zeros to the number 42.

Now, consider a list of integer numbers of different lengths stored in a file:

# inputfile.txt
10
4752
121
587
78
403279

To make all the integers equal in length, you need to format those by adding necessary leading zeros. Here is how to do this:

#!/bin/bash

# Specify the desired length of the formatted integers
desired_length=6
touch outputfile.txt

# Read integers from the input file and format them
while read -r number; do
formatted_number=$(printf "%0${desired_length}d\n" "$number")
echo "$formatted_number" >> outputfile.txt
done < inputfile.txt

echo "Formatted numbers written to outputfile.txt:"
cat outputfile.txt
EXPLANATION

The while loop iterates through each line in the “inputfile.txt”, where each line contains an integer. The read -r command reads and stores each integer in a variable named number. The printf command is then utilized to format the number by adding leading zeros, ensuring a fixed length as defined by the desired_length variable, which is set to 6 in this example. The formatted number is subsequently appended to the “outputfile.txt” file, which was created earlier in the program using the touch command. This process repeats for each integer in the input file.

Zero padding multiple integersIf you look at the output, the length of all the numbers becomes 6 after formatting them by adding leading zeros.

Formatting Floating Point Numbers to Maintain Equal Length

“%f” format specifier is used for formatting floating point numbers. Consider the floating point number 3.1416. The width of the number (including the decimal point) is 6. To format the number and make the width 10, try the following command:

printf '%010.5f\n' 3.1416
EXPLANATION

“%010.5f\n” is the format specifier to format the floating point number 3.1416.

%: Indicates the beginning of the format specifier.

0: Specifies that padding before the decimal point should be done with zero.

10: Specifies the minimum width of the number should be 10.

5: Specifies the length of digits after the decimal point.

f: Specifies that the number to be formatted is a floating point number.

Formatting floating point numbers by adding leading and tailing zerosAfter execution of the command, the width of the formatted floating-point number is 10. There are five digits after the decimal point and four digits before the decimal point. Necessary leading and tailing zeros are added to keep the fixed width.

To format multiple floating-point numbers simultaneously, list them consecutively followed by the format specifier. Place a space between each number to keep them distinct like the command below:

printf '%010.5f\n' 1.125 531.4561 31.33 1.2

Formatting multiple floating point numbers at a timeAs you can see all the provided numbers are returned as 10-digit numbers. For example, 1.125 becomes 0001.12500. In this case, three leading zeros and two tailing zeros are added to make it a 10-digit number.

2. Format Numbers by Thousand Separator (Commas)

To format numbers with thousand separator (commas) using the printf command in Bash, you can place a single quote () after the % sign of the format specifier. Let’s say you have the number 8154321. You can represent it with thousand separators as follows:

printf "%'d\n"  8154321
EXPLANATION

Due to the single quote (') placed after % and before d, comma will be printed as a thousand separator. The whole format specifier will be applied to the number that is given after by the specifier.

Inserting comma as a thousand separator in BashIf you look at the output, a comma is inserted at the thousand positions in the given number 8154321. So the number becomes 8,154,321- which is more readable.

To add comma as a thousand separator to multiple numbers at a time, place those numbers after the format specifier one after one.Here both the numbers 8154321 and 578757 returned with the comma inserted in the thousand positions.

You can insert comma thousand separator in a floating point number as well. But make sure you use %f format specifier to indicate the floating point number.

printf "%'.2f\n" 2405770.54

Inserting thousand separator in floating point numbers

3. Convert Numbers to Currency Format in Bash

Sometimes it is necessary to represent numbers in currency format. To add currency signs with numbers using the printf command, users need to specify the signs in the format specifier. Below commands add the dollar sign and rupee sign respectively to express the numbers in currency format.

printf "$%'.2f\n" 457.50
printf "INR.%'.2f\n" 457.50
EXPLANATION

The first command adds a dollar sign to 457.50. The second command represents 457.50 in Indian Rupees with two decimal places. The prefixes $ and INR in the format specifier ensure the addition of the currency signs.

4. Adding Scientific Notation to Numbers

Formatting numbers by adding scientific notation is the best way to represent very large or small numbers in a compact way. The printf command in Bash supports printing numbers in scientific format. Look at the following examples:

printf "%.2e\n" 0.000000123
printf "%.2e\n" 0.000000000000000000000123
printf "%.2e\n" 667154874454
EXPLANATION

In the above commands, "%.2e\n" is the format specifier. 2 specifies the number of digits after the decimal point. e indicates exponential. The commands adjust the number after exponential including the sign to express the number after the format specifier in scientific format.

Converting numbers to scientific format in BashIf you look at the numbers, the printf command successfully adds scientific notation to those. For instance, 0.000000123 is represented as 1.23e-07. Also, the sign after the exponential is properly adjusted reflecting the nature of the number.

5. Converting Numbers to Time Format in Bash

It is often required to convert numbers, such as Unix timestamps, to a human-readable time format in Bash. The -d option of the date command can convert timestamp numbers presented in seconds into a time-date format. Look at the following command to do this:

date -d @47455779
EXPLANATION

-d option of the date command converts the Unix timestamp given after the @ sign.

Unix timestamp to date time format in BashAs you can see, the output of the command shows a human-readable date and time which is equivalent to the Unix timestamp 47455779 seconds since the Unix epoch (January 1, 1970 00:00:00 UTC).

6. Remove Leading Zeros From Numbers in Bash

To remove leading zeros from a number, format the numbers using parameter expansion. For instance, ${num#0} removes a single leading zero from the variable num. Iterating this using a loop essentially deletes all the leading zeros from the number. Here’a how:

#!/bin/bash

num=000475
echo “Before removing leading zeros: $num”
while [ "$num" != "${num#0}" ];
do num=${num#0};
done

echo “After removing leading zeros: $num”
EXPLANATION

The while loop iteratively removes leading zeros from a variable named num. The loop condition checks if the original value of num is not equal to the value of num with leading zeros removed. Within the loop, the expression ${num#0} removes the shortest match of 0 from the beginning of the num variable. The loop continues until no leading zeros are left in num.

Removing leading zeros from integer numbers in BashUpon execution, the program removes all the leading zeros from the number 000475.

In addition to the printf command, one can use awk command to remove leading zeros from a number. To do so, use the command below:

echo "005487" | awk '{$0=int($0)}1'
EXPLANATION

The code takes the string “005487” and converts it to an integer using awk. '{$0=int($0)}1' ensures the integer conversion and prints the number without any leading zeros.

awk command to remove leading zeros in Bash

Conclusion

In conclusion, formatting numbers is an easy task in Bash. Different format specifier of the printf command allows the user to tailor the output of formatting. I believe this article helped you to understand the format specifiers in detail.

People Also Ask

How to zero padd a variable in ksh?

In Korn Shell (ksh), the typeset -Z command is used to zero-fill a variable. The -Z option is followed by a digit specifying the field width. When you use typeset -Z5 x, it means that the variable x will be zero-filled to a field width of 5 characters.

x=26 typeset -Z5 x
echo $x  # Output: 00026

What are the pitfalls of zero padding using “printf” in Bash?

Octal representation is one of the main pitfalls of zero-padding using printf. An octal number takes a 0 prefix. Therefore, a decimal number that already has a leading zero is considered an octal. Zero-padding such numbers leads to an unintended result.

printf '%06d' 0666
# Output: 000438

How to remove leading zeros using “sed” command in Bash?

To remove leading zeros from a number using the sed command in Bash, you can use the following syntax:

echo "000123" | sed 's/^0*//'

Here, ^ anchors the pattern to the beginning of the line. 0* matches zero or more occurrences of the digit zero. Finally, // replaces the matched pattern with an empty string.

How to use sub() function of awk tool to remove zero padding?

To remove zero padding using sub() in awk, you can create a regular expression that matches leading zeros and replace them with an empty string. For example:

echo "000123" | awk '{sub(/^0*/,"")}1'

In this command, ^ indicates the beginning of the string. 0* matches one or more occurrences of the digit “0”. "" is an empty string, which effectively removes the matched portion.

Related Articles


<< Go Back to Arithmetic Operators in Bash | Bash Operator | Bash Scripting Tutorial

Rate this post
Md Zahidul Islam Laku

Hey, I'm Zahidul Islam Laku currently working as a Linux Content Developer Executive at SOFTEKO. I completed my graduation from Bangladesh University of Engineering and Technology (BUET). I write articles on a variety of tech topics including Linux. Learning and writing on Linux is nothing but fun as it gives me more power on my machine. What can be more efficient than interacting with the Operating System without Graphical User Interface! Read Full Bio

Leave a Comment