如何用逗号分隔列表不是空格

我想用逗号分隔文本,而不是空格 for foo in listfor foo in list 。 假设我有一个CSV文件CSV_File其中包含以下文本:

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

我用下面的代码将其分成几个单词:

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

它打印:

 Hello World Questions Answers bash shell script 

但我希望它通过逗号分隔文本不是空格:

 Hello World Questions Answers bash shell script 

我怎样才能达到这个bash?

使用一个子shellreplace来parsing这些单词可以解除所有的工作,把空间放在一起。

改为:

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

这也增加了并行性。 在您的问题中使用子shell将强制整个子shell进程完成,然后才能开始迭代答案。 pipe道到一个子shell(如我的答案),让他们并行工作。 只有当文件中有许多行时,这才是重要的。

将IFS设置为,:

 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:~$ 

我认为规范的方法是:

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

如果你不知道或不关心有多less个领域:

 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 
 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 

阅读: http : //linuxmanpages.com/man1/sh.1.php&http : //www.gnu.org/s/hello/manual/autoconf/Special-Shell-Variables.html

IFS内部字段分隔符,用于扩展后的字词拆分,以及使用读取内置命令将字词拆分为单词。 默认值是“`”。

IFS是一个shell环境variables,所以它将在Shell脚本的上下文中保持不变,除非你导出它。 还应该注意,IFS不可能从您的环境中inheritance:请参阅此gnu文章,了解IFS的原因和更多信息。

你的代码是这样写的:

 IFS="," for word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $word; done; 

应该工作,我在命令行上testing它。

 sh-3.2#IFS="," sh-3.2#for word in $(cat tmptest | sed -n 1'p' | tr ',' '\n'); do echo $word; done; World Questions Answers bash shell script 

创build一个bash函数

 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 

…这将生成以下输出:

 Item: this Item: is a Item: list 

(注意,这个答案已根据一些反馈更新)

您可以使用:

 cat f.csv | sed 's/,/ /g' | awk '{print $1 " / " $4}' 

要么

 echo "Hello,World,Questions,Answers,bash shell,script" | sed 's/,/ /g' | awk '{print $1 " / " $4}' 

这是用空格replace逗号的部分

 sed 's/,/ /g'