首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把1排分成多排

把1排分成多排
EN

Stack Overflow用户
提问于 2015-11-03 00:05:07
回答 2查看 42关注 0票数 0

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

代码语言:javascript
复制
FName, LName, Family Role
Stan, Smith, Husband | Father | Son
Francine, Smith, Wife | Mother
Steve, Smith, Son
Hayley, Smith, Wife | Daughter
Roger, Smith, Alien

我希望得到以下输出:

代码语言:javascript
复制
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等实际操作中完成的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 00:31:12

代码语言:javascript
复制
$ 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对输出字段分隔符使用逗号。

改进

除非名称或姓氏包含|,否则上述操作是可行的。如果发生这种情况,那么这些字段就会被分割错。我们可以使用稍微复杂一些的命令来避免这种情况。此命令根据,将行划分为字段。然后,通过在|上拆分第三个字段,将其划分为角色。

代码语言:javascript
复制
$ 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
EN

Stack Overflow用户

发布于 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开头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33489251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档