将1行拆分为多个

时间:2015-11-03 00:05:07

标签: sql excel shell

我有以下逗号分隔文件:

str1.localeCompare

我希望得到以下输出:

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

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

2 个答案:

答案 0 :(得分:1)

$ 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,其余字段(每个角色一个)从3开始编号。

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

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

  • OFS=,

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

改进

除非名字或姓氏可以包含|,否则以上情况有效。如果发生这种情况,则字段将被错误分割。我们可以通过稍微复杂的命令来避免这种情况。此命令将行划分为基于,的字段。然后,通过将第三个字段拆分为|

,将其划分为角色
$ 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

答案 1 :(得分:0)

@ John1024解决方案的Perl版本:

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

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

开头