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

Awk 如果最后一列中有两个或多个条目,请为每个条目创建独立的行,awk,Awk,我有一个以下格式的文件 a 2 10 a,c b 5 8 c b 7 2 a c 9 0 c,d,a 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 现在,对于在最后一列中有多个条目的人,我希望最后一列中的每个条目都有一个新行(第1-3列保持不变),格式如下 a 2 10 a,c b 5 8 c b 7 2 a c 9 0 c,d,a a 2 10 a a 2 10 c b 5 8 c b 7 2 a c 9 0 d c

我有一个以下格式的文件

a 2 10 a,c
b 5 8 c
b 7 2 a
c 9 0 c,d,a
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
现在,对于在最后一列中有多个条目的人,我希望最后一列中的每个条目都有一个新行(第1-3列保持不变),格式如下

a 2 10 a,c
b 5 8 c
b 7 2 a
c 9 0 c,d,a
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
请提供一些建议。

这里有一种方法:

$ 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

$awk'{n=split($NF,ary,/,/);NF--;for(i=1;i使用空格和逗号作为字段分隔符,然后从第四个字段开始打印第一、第二、第三和第四个字段:

awk -F'[[:space:],]+' '{for(i=4;i<=NF;++i)print $1,$2,$3,$i}' file
如果您不反对一点Perl:

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

同样,在逗号和空格上拆分行。与awk逻辑大致相同,但短了几个字符:)

解决方案必须是针对
awk
?不一定。我在这里浏览了不同的帖子,觉得awk可以解决它。最后三行的顺序正确吗?应该是
c
d
a
吗?你有
d
c
a
我向约坦道歉。你是对的,你可以注意数组而不是设置列表分隔符变量。这将以完全相同的方式输出
perl-F'[,\s]+'-lane'print“@F[0..2,$\对于3..$#F'文件
我确信它不是必需的,但我不记得为什么了!谢谢:)不客气。当我想用单个空格以外的东西(如
等)连接数组元素时,我通常使用列表分隔符变量使用
join
也可以很容易地实现这一点,但是我想
TIMTOWDI
:)
。所有这些特殊变量都将从
perl 6
中删除,以使胆小的人更加理智。