パターンが一度だけ表示されるファイルから行を削除します。

パターンが一度だけ表示されるファイルから行を削除します。

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=""}'

関連情報