首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按空格分隔文件上的两个字段对元素进行分组

按空格分隔文件上的两个字段对元素进行分组
EN

Stack Overflow用户
提问于 2014-08-08 14:59:19
回答 6查看 167关注 0票数 0

我在空格分隔的文件中按列2、3和1排序了这些数据(我使用了linux这样做):

代码语言:javascript
复制
0 0 2
1 0 2
2 0 2
1 1 4
2 1 4

我想要创建一个新文件(保留原来的文件)

代码语言:javascript
复制
0 2 0,1,2
1 4 1,2

基本上,将字段2和3放在第一位,并按字段1(作为逗号分隔列表)的元素分组。有什么方法可以通过awk,sed,bash one liner来实现这一点,从而避免为此编写一个Java,C++应用程序吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-08 15:15:04

由于文件已经被排序,您可以在它们更改时打印该行:

代码语言:javascript
复制
awk '
  seen==$2 FS $3 { line=line "," $1; next }
  { if(seen) print seen, line; seen=$2 FS $3; line=$1 }
  END { print seen, line }
' file
0 2 0,1,2
1 4 1,2

这将保持输出的顺序。

票数 2
EN

Stack Overflow用户

发布于 2014-08-08 15:09:44

使用awk

代码语言:javascript
复制
awk '{k=$2 OFS $3} !(k in a){a[k]=$1; b[++n]=k; next} {a[k]=a[k] "," $1}
     END{for (i=1; i<=n; i++) print b[i],a[b[i]]}' file
0 2 0,1,2
1 4 1,2
票数 1
EN

Stack Overflow用户

发布于 2014-08-08 15:15:46

对于您的输入和输出,这一行可能会有所帮助:

代码语言:javascript
复制
 awk '{f=$2 FS $3}!(f in a){i[++p]=f;a[f]=$1;next}
      {a[f]=a[f]","$1}END{for(x=1;x<=p;x++)print i[x],a[i[x]]}' file

测试:

代码语言:javascript
复制
kent$  cat f
0 0 2
1 0 2
2 0 2
1 1 4
2 1 4

kent$  awk '{f=$2 FS $3}!(f in a){i[++p]=f;a[f]=$1;next}{a[f]=a[f]","$1}END{for(x=1;x<=p;x++)print i[x],a[i[x]]}' f
0 2 0,1,2
1 4 1,2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25206406

复制
相关文章

相似问题

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