将一行分成多个部分

我有以下逗号分隔的文件:

FName, LName, Family Role Stan, Smith, Husband | Father | Son Francine, Smith, Wife | Mother Steve, Smith, Son Hayley, Smith, Wife | Daughter Roger, Smith, Alien 

我希望以下输出:

 Fname, LName, Family Role Stan, Smith, Husband Stan, Smith, Father Stan, Smith, Son Francine, Smith, Wife Francine, Smith, Mother Steve, Smith, Son Hayley, Smith, Wife Hayley, Smith, Daughter Roger, Smith, Alien 

我可以使用哪些工具/语言来实现这一点,我有很大的余地。 如果在Excel(VBA),SQL,Shell,Powershell中完成,无论如何。

 $ awk -F' *[,|]' '{for (i=3;i<=NF;i++) print $1,$2,$i}' OFS=, file FName, LName, Family Role Stan, Smith, Husband Stan, Smith, Father Stan, Smith, Son Francine, Smith, Wife Francine, Smith, Mother Steve, Smith, Son Hayley, Smith, Wife Hayley, Smith, Daughter Roger, Smith, Alien 

怎么运行的

awk隐式地循环遍历文件中的每一行,并将每一行分割成字段。

  • -F' *[,|]'

    这告诉awk使用字段分隔符空格(可选),后跟一个或者| 。 这样,第一个名字是字段1,第二个字段是字段2,其余的字段,每个angular色一个,从3开始编号。

  • for (i=3;i<=NF;i++) print $1,$2,$i

    这告诉awk为每个angular色打印一行。

  • OFS=,

    这告诉awk使用输出字段分隔符的逗号。

起色

除非可能的名字或姓氏包含一个|否则上述工作 。 如果这种情况发生,那么这些田地就会被分裂。 我们可以用一个稍微复杂的命令来避免这种情况。 这个命令把行分成基于, 。 然后,第三个领域被分割成|angular色 :

 $ awk -F' *,' '{n=split($3, role, "|"); for (i=1;i<=n;i++) print $1,$2,role[i]}' OFS=, file FName, LName, Family Role Stan, Smith, Husband Stan, Smith, Father Stan, Smith, Son Francine, Smith, Wife Francine, Smith, Mother Steve, Smith, Son Hayley, Smith, Wife Hayley, Smith, Daughter Roger, Smith, Alien 

@ John1024的Perl版本的解决scheme:

perl -F'\s*[,|]' -lane 'for ($i=2;$i<=$#F;$i++){print "$F[0],$F[1],$F[$i]"}' file

perl中的字段以$F[0]开头,而awk以$1开头