如何将逗号分隔的字段转换为不同的行?

时间:2016-10-02 17:18:50

标签: linux awk

我有一个这样的文件:

A 10,30,50,70 20,40,60,80 +

我怎样才能成为:

A 10 20 +
A 30 40 + 
A 50 60 + 
A 70 80 +

我尝试使用这个awk命令,但它没有用。

awk '{ split($2,a,","); for (i in a) print $1, a[i]; }'

4 个答案:

答案 0 :(得分:2)

创建另一个拆分数组<database>,其中保留了第3列元素:

b

答案 1 :(得分:2)

awk '{  split ($2, a,","); split ($3,b,",");  for (i in a) print $1, a[i], b[i], $NF; }'

应该给你结果。

答案 2 :(得分:1)

这可能就是你要找的东西:

$ awk -F'[ ,]' '{for (i=2;i<6;i++) print $1, $i, $(i+4), $NF}' file
A 10 20 +
A 30 40 +
A 50 60 +
A 70 80 +

或者如果您不想硬编码字段数:

$ awk -F'[ ,]' '{n=NF/2; for (i=2;i<=n;i++) print $1, $i, $(i+n-1), $NF}' file
A 10 20 +
A 30 40 +
A 50 60 +
A 70 80 +

答案 3 :(得分:0)

$ cat ip.txt 
A 10,30,50,70,90 20,40,60,80,00 +
B ab,56,is,jw,23 09,we,io,21,aw +

通用解决方案,与第2和第3列中逗号分隔值的数量无关...

$ perl -lane '@a = split/,/,$F[1]; @b = split/,/,$F[2]; foreach (0..$#a){ print "$F[0] $a[$_] $b[$_] $F[3]" }' ip.txt 
A 10 20 +
A 30 40 +
A 50 60 +
A 70 80 +
A 90 00 +
B ab 09 +
B 56 we +
B is io +
B jw 21 +
B 23 aw +


以及类似于Ed Morton's answer

的解决方案
$ perl -F'/\s|,/' -lane 'foreach (1..5){ print "$F[0] $F[$_] $F[$_+5] $F[-1]" }' ip.txt 
A 10 20 +
A 30 40 +
A 50 60 +
A 70 80 +
A 90 00 +
B ab 09 +
B 56 we +
B is io +
B jw 21 +
B 23 aw +

其中foreach (1..5)$F[$_+5]表示第2和第3列中有5个逗号分隔值