CSV加入一些具有相同ID的行

时间:2014-02-13 02:36:16

标签: ruby bash csv awk

我有一个CSV这样的文件

1,A,abc
2,A,def
1,B,smthing
1,A,ghk
5,C,smthing

现在我想连接第2行具有相同值的所有行。在这种情况下,第二个元素的行是A.返回文件应该是

1,A,abcdef,ghk
3,B,smthing
5,C,smthing

我正在尝试使用awk,我可以获得第二个和第三个字段,但不是这样的整个文件

awk -F, '{a[$2]=a[$2]?a[$2]$3:$3;}END{for (i in a)print i","a[i];}' old_file.csv > new_file.csv

更新

我用2命令解决了我的问题。首先创建一个new_file.csv(上面的命令) 第二个命令将old_file与new_file连接

awk -F, 'NR == FNR {a[$1] = $2;} NR != FNR && a[$2] {print $1","$2","a[$2];}' new_file.csv old_file.csv > last_file.csv

last_file.csv看起来像这样

1,A,abcdefghk
2,A,abcdefghk
1,B,smthing
1,A,abcdefghk
5,C,smthing

那么,我该如何从这两个命令中获得更好的命令呢? 谢谢!

1 个答案:

答案 0 :(得分:2)

一个awk就足够了:

awk 'NR==FNR{a[$2]=a[$2]==""?$3:a[$2] $3;next}{$3=a[$2]}1' FS=, OFS=, file file

1,A,abcdefghk
2,A,abcdefghk
1,B,smthing
1,A,abcdefghk
5,C,smthing

解释

  • NR==FNR{a[$2]=a[$2]==""?$3:a[$2] $3;next}将记录合并到数组a(键是第2列)
  • $3=a[$2]再次读取输入文件,使用新值更改第3列。

添加命令以删除重复记录(第2列),保留第一个记录。

awk 'NR==FNR{a[$2]=a[$2]==""?$3:a[$2] $3;next}!b[$2]++{$3=a[$2];print}' FS=, OFS=, file file

1,A,abcdefghk
1,B,smthing
5,C,smthing