我有一个巨大的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
答案 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