我有一个巨大的csv文件,每一行都有4个字段(ID1、ID2、score、elem):
HELLO,WORLD,2323,elem1
再见,蓝调,3232,elem2
你好,世界新闻, 421,elem3
再见,蓝调,41134,elem4
等等..。
我希望合并在同一行上具有相同ID1、ID2字段的每一行,从而消除得分字段,从而导致:
你好,世界, elem1,elem3.
再见,蓝调, elem2,elem4.
等等..。
每个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发布于 2016-07-11 15:54:08
您的键应该是复合的,还需要设置分隔符以容纳逗号和空格。
$ 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开始),所以要处理第一个元素。当完成所有记录(结束块)时,打印所有键和值。
若要添加长度,请保留一个并行计数器,并在每次为每个键追加时递增,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, elem3https://stackoverflow.com/questions/38310825
复制相似问题