How to split a list by comma not space

127,605

Solution 1

Using a subshell substitution to parse the words undoes all the work you are doing to put spaces together.

Try instead:

cat CSV_file | sed -n 1'p' | tr ',' '\n' | while read word; do
    echo $word
done

That also increases parallelism. Using a subshell as in your question forces the entire subshell process to finish before you can start iterating over the answers. Piping to a subshell (as in my answer) lets them work in parallel. This matters only if you have many lines in the file, of course.

Solution 2

Set IFS to ,:

sorin@sorin:~$ IFS=',' ;for i in `echo "Hello,World,Questions,Answers,bash shell,script"`; do echo $i; done
Hello
World
Questions
Answers
bash shell
script
sorin@sorin:~$ 

Solution 3

I think the canonical method is:

while IFS=, read field1 field2 field3 field4 field5 field6; do 
  do stuff
done < CSV.file

If you don't know or don't care about how many fields there are:

IFS=,
while read line; do
  # split into an array
  field=( $line )
  for word in "${field[@]}"; do echo "$word"; done

  # or use the positional parameters
  set -- $line
  for word in "$@"; do echo "$word"; done

done < CSV.file

Solution 4

kent$  echo "Hello,World,Questions,Answers,bash shell,script"|awk -F, '{for (i=1;i<=NF;i++)print $i}'
Hello
World
Questions
Answers
bash shell
script

Solution 5

Create a bash function

split_on_commas() {
  local IFS=,
  local WORD_LIST=($1)
  for word in "${WORD_LIST[@]}"; do
    echo "$word"
  done
}

split_on_commas "this,is a,list" | while read item; do
  # Custom logic goes here
  echo Item: ${item}
done

... this generates the following output:

Item: this
Item: is a
Item: list

(Note, this answer has been updated according to some feedback)

Share:
127,605
Eng.Fouad
Author by

Eng.Fouad

I am in love with Java.

Updated on July 09, 2022

Comments

  • Eng.Fouad
    Eng.Fouad almost 2 years

    I want to split a text with comma , not space in for foo in list. Suppose I have a CSV file CSV_File with following text inside it:

    Hello,World,Questions,Answers,bash shell,script
    ...
    

    I used following code to split it into several words:

    for word in $(cat CSV_File | sed -n 1'p' | tr ',' '\n')
    do echo $word
    done
    

    It prints:

    Hello
    World
    Questions
    Answers
    bash
    shell
    script
    

    But I want it to split the text by commas not spaces:

    Hello
    World
    Questions
    Answers
    bash shell
    script
    

    How can I achieve this in bash?