如果最后一列中有两个或多个条目,则为每个条目创建独立行

时间:2014-08-14 19:32:50

标签: awk

我有以下格式的文件

a 2 10 a,c
b 5 8 c
b 7 2 a
c 9 0 c,d,a

现在对于那些在最后一列中有多个条目的人,我希望以下格式为最后一列中的每个条目添加一个新行(1-3列保持不变)

a 2 10 a
a 2 10 c
b 5 8 c
b 7 2 a
c 9 0 d
c 9 0 c
c 9 0 a

请一些建议。

2 个答案:

答案 0 :(得分:4)

使用空格和逗号作为字段分隔符,然后从第4个字段开始打印第1,第2,第3和i字段:

awk -F'[[:space:],]+' '{for(i=4;i<=NF;++i)print $1,$2,$3,$i}' file

输出:

a 2 10 a
a 2 10 c
b 5 8 c
b 7 2 a
c 9 0 c
c 9 0 d
c 9 0 a

如果你不喜欢Perl:

perl -F'[,\s]+' -lane 'print "@F[0..2,$_]" for 3..$#F' file

再次,将逗号和空格分开。或多或少与awk相同的逻辑但短几个字符:)

答案 1 :(得分:3)

这是一种方式:

$ awk '{n=split($NF,ary,/,/); NF--; for(i=1;i<=n;i++) print $0, ary[i]}' file
a 2 10 a
a 2 10 c
b 5 8 c
b 7 2 a
c 9 0 c
c 9 0 d
c 9 0 a

我们将,上的最后一个字段拆分,并将字段存储在名为ary的数组中。 split返回我们存储在变量n中的分割字段数。我们使用NF--从行中删除最后一个字段,并遍历元素数量(来自最后一个字段)并打印该行以及ary中的元素。