删除文件中模式仅出现一次的行

删除文件中模式仅出现一次的行

我有一个 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=""}'

相关内容