合并csv文件的行与相同的初始字段并按其长度排序

时间:2016-07-11 15:31:33

标签: file sorting csv unix awk

我有一个巨大的csv文件,每行有4个字段(ID1,ID2,分数,元素):

HELLO,WORLD ,2323,elem1

GOODBYE,BLUESKY ,3232,elem2

HELLO,WORLD, 421,elem3

GOODBYE,BLUESKY ,41134,elem4

... ETC

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

HELLO,WORLD, elem1,elem3 .....

GOODBYE,BLUESKY, elem2,elem4 .....

... ETC

其中每个 elem 来自具有相同 ID1,ID2的不同行。 之后,我想根据它们的长度排序。

我曾尝试在java中进行编码但是超级低。我在网上看过有关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

1 个答案:

答案 0 :(得分: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分隔的前两个字段创建一个复合键(因为我们将在输出中使用它)。将第四个字段附加到由key索引的数组元素(处理第一个元素特殊,因为我们不想从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