我有一个这样的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