linux,以逗号分隔的单元格保留行/聚合列
除了excel/vba之外,这里还有一个类似的问题 因为我有一个大文件(>300mb),所以这不是一个选项,因此我正在努力让它在bash中工作 基于此数据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
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)
}'