2016-07-11 20 views
0

它们排序我有对该格式的每一行4个字段巨大csv文件(ID1,ID2,得分,ELEM):合并csv文件的行具有相同的初始场,并通过它们的长度

HELLO,世界,2323,elem1

GOODBYE,BLUESKY,3232,elem2时

HELLO WORLD, 421,elem3

GOODBYE,BLUESKY,41134,elem4

ETC ...

我想合并具有相同的ID1每一行,在同一行消除了得分字段ID2领域,从而导致:

HELLO WORLD, elem1,elem3 .....

GOODBYE,蓝天, elem2时,elem4 .....

ETC ...

其中每个ELEM来自不同的线使用相同的ID1,ID2。 之后,我想根据它们的长度对行进行排序。

我试图在java中编码,但是是superslow。我已经在线阅读了关于AWK的内容,但是我无法真正找到一个能够理解它的csv文件语法的好地方。 我使用了这个命令,我该如何适应我的需求?

awk -F',' 'NF>1{a[$1] = a[$1]","$2}END{for(i in a){print i""a[i]}}' finale.txt > finale2.txt^C 
+0

更改'$ 2'为'$ 4',那应该这样做。 – jas

+0

我也想匹配第二个字段,这是额外条件的语法,如[$ 1] = a [$ 1]? – Aalto

回答

1

你的钥匙应该是合成的,还需要设置逗号和空格的分隔符。

$ 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开头,所以请首先处理第一个元素)。当所有记录完成(END块)时,打印所有的键和值。

要添加长度保持一个并行计数器,并且每次为每个键附加c[k]++时增加并在打印时使用它。也就是,

$ 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 
+0

非常感谢您的时间,我可以问您解决方案的语法解释吗? – Aalto

+0

问题是,我想以第三个字段的形式添加该特定行(ID1,ID2,length,elem1,elem2,...)的元素数量,以便使用该字段的文件行。 – Aalto

相关问题