Import CSV value into Bash

awk, bash, csv, linux, sed

Solution

Basic building block to solve your problem:

#!/bin/bash

while IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
do
    echo $Alabama
done < my_file.csv

Given your input file, this produces:

sh$ ./m.sh 
Alabama
1000
100
10001

EDIT If you are only interested in the n-th line (stored in `CSV_LINE`), you could `sed -n ...p` your input file (and use `if` instead of `while`):

#!/bin/bash

# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...

sed -n "${CSV_LINE}p" | if IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
then
    echo $Alabama
fi < my_file.csv

Please note: since pipes are executed in a sub shell, the various variables are only bound inside the body of the `if` statement.

If you don't like the `if` construct, I've just learned than using process substitution you might write:

#!/bin/bash

# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...

IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa \
       < <(sed -n "${CSV_LINE}p" < my_file.csv)

echo $Alabama

Without a pipe there is not sub-shell -- so the variable are accessible from anywhere in the script after issuing the `read` internal command.

Problem

I have the following CSV file: ``` more my_file.csv Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,Florida,Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa 1000,"1 0 0 1",1002,1002,1003,1004,1005,"1 0 0 6",1007,1008,1009,1010,1011,1012,1013 100," 1 0 1 ",102,102,103,104,105,"1 0 6 2",107,108,109,"1 1 0 3 5 62 0",111,112,113 10001,10011,10021,10021,10031,10041,10051,10061,10071,10081,10091,10101,10111,10121,10131 . . . . ``` My target is to set the CSV parameters ( all states in CSV ) with their values in my bash script for example ( regarding the second line values ) in my bash script I will able to read each parameter example ``` echo $Alabama 1000 echo $Alaska 1 0 0 1 ``` First I just tried to write the following (wrong) code, in order to set the parameters with their values: ``` #!/bin/bash counter=1 for CSV_COLUMN in Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois Indiana Iowa do export $CSV_COLUMN=` echo $CSV_LINE | cut -d',' -f$counter ` counter=$counter+1 done ``` The test should be (from the bash script) ``` echo $Alabama 1000 ``` How should I change my code in order to implement my idea?

Original source