我有一个巨大的csv文件,每行有4个字段,格式为(ID1,ID2,score,elem):
你好, 世界, 2323, elem1
再见, 蓝天, 3232, elem2
你好, 世界, 421, elem3
再见, 蓝天, 41134, elem4
等。。。
我想在同一行上合并具有相同 ID1,ID2 字段的每一行,从而消除分数字段,导致:
你好,世界,elem1,elem3.....
再见,蓝天,elem2,elem4.....
等。。。
其中每个电子来自具有相同 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
您的键应该是复合的,还需要设置分隔符以容纳逗号和空格。
$ 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