使用shell脚本将逗号分隔值转换为值列表

时间:2015-06-26 10:57:19

标签: bash shell unix cut

我有csv数据,如:

a,b,c,d,e,f,g,h

我希望这些数据在列表中,每行一个字母。有可能是shell脚本吗?我试图使用cut命令提取每个字母,如下所示:

less list.txt | cut -d"," -f?

该命令正在运行,但此处的问题是字段数未知。我必须将此命令放在循环中并迭代列表,以便我可以逐个提取值并将它们重定向到另一个文件。

4 个答案:

答案 0 :(得分:11)

使用tr,更改为换行符:

tr , "\n" < list.txt

请参阅https://en.wikipedia.org/wiki/Tr_(Unix)

答案 1 :(得分:2)

是的,您可以使用cut。关键点是--output-delimiter的使用。如果将其设置为新行,则一切正常:

cut -d',' --output-delimiter=$'\n' -f1- file

还要注意两个事实:

  • 我们使用-f1-从第一个字段打印到最后一个字段。 n-语法表示:从第n个字段到结尾。
  • 我们使用$'\n'因为仅\n会打印文字\n而不是真正的新行。

测试

$ echo "a,b,c,d,e,f,g,h" | cut -d',' --output-delimiter=$'\n' -f1-
a
b
c
d
e
f
g
h

来自man cut

  

<强> - 输出定界符= STRING

     

使用STRING作为输出分隔符,默认是使用输入   定界符

答案 2 :(得分:2)

您可以使用sed

sed "s/,/\n/g" list.txt

<强>输出

a
b
c
d
e
f

答案 3 :(得分:1)

您可以使用tr命令将每个“,”转换为换行符。

cat list.txt | tr "," "\n"

从那时起,您可以使用while循环

在任意位置输出每一行
cat list.txt | tr "," "\n" | while read LINE
 do
  echo "$LINE" >> ~/wherever/you/want
done

或......

while read LINE
 do
  echo "$LINE" >> ~/wherever/you/want
done <<< "$(cat list.txt | tr "," "\n")"

要么有效。