如何在bash中转换CSV文件?

3
我有一个文件,每行都是逗号分隔的值列表。例如,
1, a, b, c, d, e
2, x, y, z
现在我想在bash中进行转换,如下所示:
1 a
1 b
1 c
1 d
1 e
2 x
2 y
2 z
如何使用shell (bash)脚本实现?
3个回答

7
awk -F, '{for(i=2;i<=NF;i++)print $1,$i}' temp

以下进行测试:

> cat temp
1, a, b, c, d, e
2, x, y, z
> awk -F, '{for(i=2;i<=NF;i++)print $1,$i}' temp
1  a
1  b
1  c
1  d
1  e
2  x
2  y
2  z

2
你可以将该行文本分割成标记并将它们放入数组中。数组的第一个元素将包含数字,在你的情况下为1或2等等。类似这样的代码可能是:

while read line
do
    arrIN=(${line//,/ })

## make a loop and echo them
## arrIN[0] will have the initial number

done < $file

# $file is the input file you are reading

1

我明白您需要一个shell脚本,但它必须是bash吗?例如,我通常会使用更高级别的脚本语言和CSV库。例如PerlText::CSV


被踩的原因是什么?在这里建议一个更高级别的脚本语言和面向CSV的库似乎并不无理。 - Brian Agnew
以上的内容怎么会是“甚至不是真正的CSV”呢? - Brian Agnew
我没有给你的答案投反对票;我不认为它很糟糕,尽管我也觉得它并不特别有用。 - Costi Ciudatu
此外,根据该RFC,空格不应被忽略,而这似乎是在这里的情况。 - Costi Ciudatu
同意。然而,问题在于CSV库(正如您所建议的)很可能无法解析这样的输入,因此仍需要自定义逻辑。 - Costi Ciudatu
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接