首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将csv文件的行与相同的初始字段合并,并按其长度对它们进行排序

将csv文件的行与相同的初始字段合并,并按其长度对它们进行排序
EN

Stack Overflow用户
提问于 2016-07-11 15:31:33
回答 1查看 33关注 0票数 0

我有一个巨大的csv文件,每一行都有4个字段(ID1、ID2、score、elem):

HELLO,WORLD,2323,elem1

再见,蓝调,3232,elem2

你好,世界新闻, 421,elem3

再见,蓝调,41134,elem4

等等..。

我希望合并在同一行上具有相同ID1、ID2字段的每一行,从而消除得分字段,从而导致:

你好,世界, elem1,elem3.

再见,蓝调, elem2,elem4.

等等..。

每个elem来自不同的行,有相同的ID1,ID2.,在那之后,我想根据它们的长度对它们进行排序。

我试过用java编写代码,但是太低了。我在网上读过关于AWK的文章,但是我找不到一个很好的地方来理解csv文件的语法。我使用了这个命令,我如何使它适应我的需要?

代码语言:javascript
复制
awk -F',' 'NF>1{a[$1] = a[$1]","$2}END{for(i in a){print i""a[i]}}' finale.txt > finale2.txt^C
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-11 15:54:08

您的键应该是复合的,还需要设置分隔符以容纳逗号和空格。

代码语言:javascript
复制
$ awk -F', *' -v OFS=', ' '{k=$1 OFS $2; a[k]=k in a?a[k] OFS $4:$4}
                        END{for(k in a) print k, a[k]}' file

GOODBYE, BLUESKY, elem2, elem4
HELLO, WORLD, elem1, elem3

解释

将字段分隔符(FS)设置为逗号后加上一个或多个空格,输出字段分隔符(OFS)设置为规范化形式(逗号和一个空格)。从用OFS分隔的前两个字段中创建一个复合键(因为我们将在输出中使用它)。将第四个字段附加到按键索引的数组元素中(因为我们不想从OFS开始),所以要处理第一个元素。当完成所有记录(结束块)时,打印所有键和值。

若要添加长度,请保留一个并行计数器,并在每次为每个键追加时递增,c[k]++并在打印时使用它。那是,

代码语言:javascript
复制
$  awk -F', *' -v OFS=', ' '{k=$1 OFS $2; c[k]++; a[k]=k in a?a[k] OFS $4:$4}
                        END{for(k in a) print k, c[k], a[k]}' file | 
   sort -t, -k3n

GOODBYE, BLUESKY, 2, elem2, elem4
HELLO, WORLD, 2, elem1, elem3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38310825

复制
相关文章

相似问题

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