我有一个 CSV 文件。它按第一个字段的标识符排序。第一个字段中的标识符可以出现在该字段中的 1 行或 2 行中。我想删除文件中标识符仅出现一次的所有行。
例如,文件包含:
Id1,x11,x12...
Id2,x21,x22...
Id2,x23,x24...
在本例中,我想删除第一行,因为 Id1 只出现一次。
答案1
尝试一下:
awk 'BEGIN{FS=",";}{if (!ids[$1]) {ids[$1]=1;lines[$1]=$0;} else {if (ids[$1]==1) {print lines[$1]; print; ids[$1]++;} else {print;}}}'
当第一次遇到一个 id 时,它被存储到id关联数组,整行存储到线关联数组但未打印。
当遇到 id 两次或更多次时,将打印存储的行,并且还会打印每个附加行。
考试:
$ cat data.csv
Id1,x11,x12...
Id2,x21,x22...
Id2,x23,x24...
$ awk 'BEGIN{FS=",";}{if (!ids[$1]) {ids[$1]=1;lines[$1]=$0;} else {if (ids[$1]==1) {print lines[$1]; print; ids[$1]++;} else {print;}}}' data.csv
Id2,x21,x22...
Id2,x23,x24...
答案2
杰伊的回答是awk
无序的通用解决方案,但对于有序,它可以更简单:
awk -F, '$1!=id {id=$1;pr=$0 ORS;next} {print pr $0;pr=""}'