Q: I have a comma separated file that I want to loop through and put each column on it’s own line. How can I loop through the csv file and echo each field? The catch is I don’t know how many fields are going to be in the csv file.
A: I thought about this for a while and came up with this solution. I am far from a programmer and not great with scripting, but it get’s the job done. Using an incrementing variable and a count of the fields to create a while loop. I commented the code with my logic (as inefficient as it may be) and highlighted the comments below.
#!/bin/bash
# Name of the csv file to loop through.
INPUTFILE="pat.csv"
# Set a FIELD variable at 1 to test when to stop looping
FIELD=1
# Find how many columns are in csv and tick by 1
COUNT=`sed 's/[^,]//g' $INPUTFILE | wc -c`; let "COUNT+=1"# Keep looping until the field is less than the count+1 (until all fields are caught in the loop)
while [ "$FIELD" -lt "$COUNT" ]; do
# Read the file and pull the current field number and print it to terminal
cat $INPUTFILE | cut -d, -f$FIELD
# Increment the FIELD variable
let "FIELD+=1"
done
Script without the comments:
#!/bin/bash
INPUTFILE="pat.csv"
FIELD=1
COUNT=`sed 's/[^,]//g' $INPUTFILE | wc -c`; let "COUNT+=1"
while [ "$FIELD" -lt "$COUNT" ]; do
cat $INPUTFILE | cut -d, -f$FIELD
let "FIELD+=1"
done
Let’s try it on a test file. For this test I created a csv file with the following contents:
Name,Address,Phone,Cell,Email,Nickname
Here is the output of the script:
Name
Address
Phone
Cell
Nickname
I am sure some people are reading this and think they have a much better way, and they probably do. I hope they will share them in the comments.
Also see "Column Command Usage and Examples" if you work with csv files on the command line often.