CSV 联接一些具有相同 ID 的行

  • 本文关键字:ID 的行 CSV 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

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

一个尴尬就足够了:

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

相关内容

  • 没有找到相关文章

最新更新