Reading and Writing CSV in Bash


Comma-Separated Values (CSV) is a widely used file format for storing data in tabular form, where each row represents a record and each column represents a field within that record. The values are separated by a comma, which is why the format is called CSV. CSV is a popular data format for exchanging information between different platforms, programs, and applications, and typially adopts the form of:


Working with CSV files is a common task for many people who work in fields such as data analysis, software development, and system administration. Knowing how to read and write CSV files in a Bash environment is essential for automating tasks and processing large amounts of data efficiently.

In this article, we will look at various ways to read and write CSV files in Bash. We'll explore the different tools available and provide examples of how to use them. Whether you're a beginner or an experienced Bash user, this article will provide you with the information you need to effectively work with CSV files in your shell scripts.

Reading CSV in Bash

Now, we'll take a look at how to extract data from a CSV file using tools available in a Bash environment.

Here's an example of how to use awk to read a CSV file and extract its data:

# Read the CSV file
while IFS="," read -r col1 col2 col3
  # Do something with the columns
  echo "Column 1: $col1"
  echo "Column 2: $col2"
  echo "Column 3: $col3"
done < input.csv

In this example, the while loop reads the CSV file line by line, with each line being separated into columns using the IFS variable, which is initially set to ",". The read command then reads the columns into the variables col1, col2, and col3. Finally, we use echo to print out the values of each column.

Alternatively, one of the most commonly used tools for reading CSV files in Bash is awk. awk is a powerful text-processing tool that can be used for a variety of tasks, including reading and processing CSV files. Here's an example command that prints the first two columns of a CSV file:

awk -F ',' '{print $1, $2}' filename.csv

In this command, the -F ',' option specifies that the field separator is a comma, and {print $1, $2} tells awk to print out the first two columns of the file filename.csv. We can modify the command to print other columns or apply conditions on the fields.

If the CSV file has a different delimiter, we can modify the -F option to match it. For instance, if the CSV file uses tabs as a separator, we can use -F '\t' to split fields based on tabs. If the CSV file has a header row, we can skip it by using the NR>1 pattern before the {print} statement.

In addition to awk, there are other tools available for reading CSV files in Bash, such as sed. sed is another text-processing tool that can be used to extract data from a CSV file.

While both awk and sed are powerful tools, they each have their own pros and cons. awk is often considered more flexible and easier to use, while sed is often considered faster and more efficient. The choice between these tools will depend on the specific requirements of your project.

Writing CSV in Bash

One of the simplest ways to write CSV files in Bash is to use the echo command and redirect its output to a file instead of the standard output pipe. For example:


# Write data to the CSV file
echo "column1,column2,column3" > output.csv
echo "data1,data2,data3" >> output.csv
echo "data4,data5,data6" >> output.csv

In this example, we use the echo command to write the header row to the output.csv file. The > operator is used to create a new file or overwrite an existing file, while the >> operator is used to append data to an existing file. In this case, we use >> to add additional rows to the output.csv file.

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

Another option for writing CSV files in Bash is to use printf. The printf command provides more control over the output format and is often used when writing to a file. For example:


# Write data to the CSV file using printf
printf "column1,column2,column3\n" > output.csv
printf "data1,data2,data3\n" >> output.csv
printf "data4,data5,data6\n" >> output.csv

In this example, we use the printf command to write the header row and data rows to the output.csv file. The format string \n is used to add a newline character at the end of each row.

Best Practices for Working with CSV in Bash

When working with large or complex CSV files in Bash, we need to follow some best practices to avoid common pitfalls and improve performance. Here are some tips:

  • Use awk instead of sed or grep for complex CSV processing tasks: awk is optimized for handling large text files and can perform complex data transformations, filtering, and formatting. sed and grep are more suitable for simple text manipulation tasks and may be faster.
  • Avoid reading or writing to CSV files in a loop: Reading or writing CSV files in a loop can be slow and inefficient, especially for large files. Instead, try to use a single awk or echo command that handles all the rows at once.
  • Use a buffer when processing large CSV files: If the CSV file is too large to fit in memory, we can use a buffer to read or write the file in chunks. For example, we can use the head or tail command to read or write the first or last n lines of a file, or we can use a combination of awk and sed to read or write a specific chunk of rows.
  • Clean and format the data before processing: CSV files often contain missing or inconsistent data that can cause errors or unexpected results. Before processing a CSV file in Bash, we should clean and format the data using tools like tr, sed, or awk. For instance, we can remove extra spaces or newlines, convert data types, or remove special characters.
  • Test the commands on a small sample before applying them to the whole file: When processing a CSV file in Bash, it's important to test the commands on a small sample of the data to make sure they work as expected. We can use the head or tail command to extract a small subset of the CSV file and test our commands on it.


In conclusion, working with CSV files in Bash can be simple and efficient, as long as we follow some best practices and use the right tools.

By using awk and echo commands, we can read and write CSV files without relying on external tools or libraries. However, we need to be careful when processing large or complex CSV files and avoid common pitfalls, such as reading or writing to files in a loop or ignoring data cleaning and formatting.

With the tips and tricks we've covered in this article, we hope you'll be able to handle CSV files in Bash with ease and confidence.

Last Updated: March 1st, 2023
Was this article helpful?

Improve your dev skills!

Get tutorials, guides, and dev jobs in your inbox.

No spam ever. Unsubscribe at any time. Read our Privacy Policy.

© 2013-2024 Stack Abuse. All rights reserved.