我有以下逗号分隔的文件:
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等实际操作中完成的。
发布于 2015-11-03 00:31:12
$ 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发布于 2015-11-03 01:09:39
@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开头。
https://stackoverflow.com/questions/33489251
复制相似问题