linux,以逗号分隔的单元格保留行/聚合列

linux,以逗号分隔的单元格保留行/聚合列,linux,bash,unix,Linux,Bash,Unix,除了excel/vba之外,这里还有一个类似的问题 因为我有一个大文件(>300mb),所以这不是一个选项,因此我正在努力让它在bash中工作 基于此数据 1 Cat1 a,b,c 2 Cat2 d 3 Cat3 e 4 Cat4 f,g 我想将其转换为: 1 Cat1 a 1 Cat1

除了excel/vba之外,这里还有一个类似的问题 因为我有一个大文件(>300mb),所以这不是一个选项,因此我正在努力让它在bash中工作

基于此数据

 1   Cat1                 a,b,c
 2   Cat2                 d
 3   Cat3                 e
 4   Cat4                 f,g
我想将其转换为:

 1   Cat1                 a
 1   Cat1                 b
 1   Cat1                 c
 2   Cat2                 d
 3   Cat3                 e
 4   Cat4                 f
 4   Cat4                 g

cat>data这看起来像是awk或perl的工作

awk 'BEGIN { FS = OFS = "\t" }
     { split($3, a, ",");
       for (i in a) {$3 = a[i]; print} }'
perl -F'\t' -alne 'foreach (split ",", $F[2]) {
                       $F[2] = $_; print join("\t", @F)
                   }'

这两个程序都基于相同的算法:用逗号分割第三列,然后迭代组件,在第三列中依次打印每个组件的原始行。

这是一种家庭作业吗,您必须在bash中完成所有工作?或者您可以使用
awk
或其他更适合该任务的方法吗?不,这不是家庭作业,我需要自动执行类似的操作,因此最好将其放入shell脚本中。我会看看awk,谢谢。在第一行和第四行,b,c和f,g之间真的有空格吗?如果是这样的话,第1行上的a,b,[空格]c有什么原因吗?最后一个问题是这些行号实际上在文件中吗?没有,对不起,没有空格。是的,文件中有一个额外的列,带有数字,一个标识符。这些列是用制表符分隔的。shell可以做到这一点,但是对于一个大文件,我希望awk或perl会快得多。
awk 'BEGIN { FS = OFS = "\t" }
     { split($3, a, ",");
       for (i in a) {$3 = a[i]; print} }'
perl -F'\t' -alne 'foreach (split ",", $F[2]) {
                       $F[2] = $_; print join("\t", @F)
                   }'