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



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

相关内容

  • 没有找到相关文章

最新更新