首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Awk:如何将其他记录的非匹配字段附加到同一字段的当前记录中?

Awk:如何将其他记录的非匹配字段附加到同一字段的当前记录中?
EN

Stack Overflow用户
提问于 2015-11-25 22:53:20
回答 2查看 55关注 0票数 0

我想将其他记录中的不匹配字段附加到当前记录的字段中。

每个记录的第一个字段是组ID。每个人都与不在其组ID中的人匹配。需要所有可能的匹配。

例如,给定names.db

代码语言:javascript
复制
1 Nikola Tesla
1 Pierre-Simon Laplace
1 Oliver Heaviside
2 James Watson
2 Francis Crick
3 Kanye West
4 Michael Faraday
4 Lord Rayleigh

变成:

代码语言:javascript
复制
Nikola Tesla -> James Watson
Nikola Tesla -> Francis Crick
Nikola Tesla -> Kanye West
Nikola Tesla -> Michael Faraday
Nikola Tesla -> Lord Rayleigh

Pierre-Simon Laplace -> James Watson
Pierre-Simon Laplace -> Francis Crick
Pierre-Simon Laplace -> Kanye West
Pierre-Simon Laplace -> Michael Faraday
Pierre-Simon Laplace -> Lord Rayleigh

Oliver Heaviside -> James Watson
Oliver Heaviside -> Francis Crick
Oliver Heaviside -> Kanye West
Oliver Heaviside -> Michael Faraday
Oliver Heaviside -> Lord Rayleigh

James Watson -> Nikola Tesla
James Watson -> Pierre-Simon Laplace
James Watson -> Oliver Heaviside
James Watson -> Kanye West
James Watson -> Michael Faraday
James Watson -> Lord Rayleigh

Francis Crick -> Nikola Tesla
Francis Crick -> Pierre-Simon Laplace
Francis Crick -> Oliver Heaviside
Francis Crick -> Kanye West
Francis Crick -> Michael Faraday
Francis Crick -> Lord Rayleigh

Kanye West -> Pierre-Simon Laplace
Kanye West -> James Watson
Kanye West -> Oliver Heaviside
Kanye West -> Francis Crick
Kanye West -> Michael Faraday
Kanye West -> Nikola Tesla
Kanye West -> Lord Rayleigh

Michael Faraday -> Nikola Tesla
Michael Faraday -> Pierre-Simon Laplace
Michael Faraday -> Oliver Heaviside
Michael Faraday -> James Watson
Michael Faraday -> Francis Crick
Michael Faraday -> Kanye West

Lord Rayleigh -> Nikola Tesla
Lord Rayleigh -> Pierre-Simon Laplace
Lord Rayleigh -> Oliver Heaviside
Lord Rayleigh -> James Watson
Lord Rayleigh -> Francis Crick
Lord Rayleigh -> Kanye West
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-26 01:36:55

我知道你的刻薄。

试试这个:

代码语言:javascript
复制
awk '{b=$1;sub($1" ","");a[$0]=b}END{for(i in a){for(j in a){if(i!=j&&a[i]!=a[j])print i" -> "j}print ""}}' file
票数 1
EN

Stack Overflow用户

发布于 2015-11-26 02:15:15

非awk解

代码语言:javascript
复制
$ join -t' ' -j 9 names{,} 
     | sed -r '/([1-9]).*\1/d;s/[1-9]//;s/[1-9]/-->/' 

  Nikola Tesla --> James Watson
  Nikola Tesla --> Francis Crick
  Nikola Tesla --> Kanye West
  Nikola Tesla --> Michael Faraday
  Nikola Tesla --> Lord Rayleigh
  Pierre-Simon Laplace --> James Watson
  Pierre-Simon Laplace --> Francis Crick
  Pierre-Simon Laplace --> Kanye West
  Pierre-Simon Laplace --> Michael Faraday
  Pierre-Simon Laplace --> Lord Rayleigh
  Oliver Heaviside --> James Watson
  Oliver Heaviside --> Francis Crick
  ...
  Michael Faraday --> Francis Crick
  Michael Faraday --> Kanye West
  Lord Rayleigh --> Nikola Tesla
  Lord Rayleigh --> Pierre-Simon Laplace
  Lord Rayleigh --> Oliver Heaviside
  Lord Rayleigh --> James Watson
  Lord Rayleigh --> Francis Crick
  Lord Rayleigh --> Kanye West

解释:创建交叉产品,用匹配的数字删除线条,删除第一个数字,用箭头替换第二个数字。当然,这一切都可以用awk来完成,但是我尝试了一些其他的改变。

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

https://stackoverflow.com/questions/33927826

复制
相关文章

相似问题

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