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

时间:2011-10-10 20:29:30

标签: linux bash shell csv split

我想在,中使用逗号而非空格for 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中实现这个目标?

7 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:44)

使用子shell替换来解析单词撤消所有正在进行的工作以将空格放在一起。

尝试改为:

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

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

答案 2 :(得分:17)

我认为规范方法是:

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

如果您不知道或不关心有多少字段:

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

答案 3 :(得分:10)

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

答案 4 :(得分:7)

创建一个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

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

答案 5 :(得分:5)

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

  

IFS内部字段分隔符,用于分词   在扩展之后,用读取将行分成单词                 内置命令。默认值为“。”。

IFS是一个shell环境变量,因此它将在Shell脚本的上下文中保持不变,但除非您导出它,否则将保持不变。另外,IFS根本不会从您的环境中继承:请参阅此gnu文章了解IFS的原因和更多信息。

你的代码写得像这样:

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

应该可以工作,我在命令行上测试过。

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

答案 6 :(得分:0)

您可以使用:

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

这是用空格替换逗号的部分

sed 's/,/ /g'