web-dev-qa-db-fra.com

Comment trouver des doublons dans la première colonne, puis supprimer des lignes entières?

J'ai un fichier xlsx (matrice 110725x9) et j'ai enregistré en tant que type de texte (onglet supprimé) car je ne sais pas si Unix aide pour les fichiers xlsx ou non. Les lignes en double sont toujours successives ligne par ligne.

Par exemple, supposons que le fichier texte soit comme suit. Vous verrez que les rangées 3,4, 7, 7 et 17 sont les mêmes. Je voudrais supprimer les lignes en double supérieure pas toujours inférieure.

2009,37214611872    2009    135 20  17,1    17,4    19,2    21,8    24,1
2009,37237442922    2009    135 22  16,5    14,5    12,6    11,2    10,5
2009,37260273973    2009    136 0   7,7     7,2     7,1     7,3     7,5
2009,37260273973    2009    136 0   7,7     7,2     7,0     7,2    7,4
2009,37488584475    2009    136 20  14,6    15,1    16,4    18,3    20,1
2009,37511415525    2009    136 22  15,9    14,6    12,8    10,9    9,4
2009,37534246575    2009    137 0   8,2     6,9     6,2     6,2     6,4
2009,37534246575    2009    137 0   8,1     6,8     6,1     6,0     6,3
2009,37557077626    2009    137 2   6,8     6,7     6,5     6,3     6,2
2009,37579908676    2009    137 4   5,8     5,6     5,4     5,4     5,7
2009,37602739726    2009    137 6   6,3     6,1     5,9     5,8     5,8
2009,37625570776    2009    137 8   4,5     5,2     6,0     6,6     7,2
2009,37648401826    2009    137 10  9,6     9,0     8,4     8,4     9,1
2009,37671232877    2009    137 12  11,4    11,7    12,4    13,4    14,4
2009,37694063927    2009    137 14  12,4    13,1    14,2    15,4    16,7
2009,37785388128    2009    137 22  15,5    14,0    12,2    10,3    8,7
2009,37808219178    2009    138 0   6,3     5,8     5,5     5,5     5,8
2009,37808219178    2009    138 0   6,2     5,7     5, 4    5,4     5,7

Donc, la sortie devrait être comme ça:

2009,37214611872    2009    135 20  17,1    17,4    19,2    21,8    24,1
2009,37237442922    2009    135 22  16,5    14,5    12,6    11,2    10,5
2009,37260273973    2009    136 0   7,7     7,2     7,0     7,2    7,4
2009,37488584475    2009    136 20  14,6    15,1    16,4    18,3    20,1
2009,37511415525    2009    136 22  15,9    14,6    12,8    10,9    9,4
2009,37534246575    2009    137 0   8,1     6,8     6,1     6,0     6,3
2009,37557077626    2009    137 2   6,8     6,7     6,5     6,3     6,2
2009,37579908676    2009    137 4   5,8     5,6     5,4     5,4     5,7
2009,37602739726    2009    137 6   6,3     6,1     5,9     5,8     5,8
2009,37625570776    2009    137 8   4,5     5,2     6,0     6,6     7,2
2009,37648401826    2009    137 10  9,6     9,0     8,4     8,4     9,1
2009,37671232877    2009    137 12  11,4    11,7    12,4    13,4    14,4
2009,37694063927    2009    137 14  12,4    13,1    14,2    15,4    16,7
2009,37785388128    2009    137 22  15,5    14,0    12,2    10,3    8,7
2009,37808219178    2009    138 0   6,2     5,7     5, 4    5,4     5,7

Comment puis-je faire cela sans trier?

4
Suat Yazıcı

Pour supprimer les doublons basés sur une seule colonne, vous pouvez utiliser awk:

awk '!seen[$1]++' input-file > output-file

Vous pouvez voir une explication à ce sujet dans cet article Unix & Linux .

Supprimer les anciennes lignes est plus compliqué. Étant donné que les doublons viennent toujours ensemble, vous pouvez faire:

awk 'prev && ($1 != prev) {print seen[prev]} {seen[$1] = $0; prev = $1} END {print seen[$1]}' input-file > output-file

Ici, dans le bloc du milieu, {seen[$1] = $0} enregistre la ligne en cours ($0) dans le tableau seen avec le premier champ ($1) sous forme d'index, puis enregistre le premier champ dans la variable prev. Cette prev est utilisée dans le premier bloc lors du traitement de la ligne suivante.

Dans le premier bloc, nous vérifions donc si prev est défini (uniquement à partir de la deuxième ligne) et différent de l'actuel premier champ (ici prev a été défini lors du traitement de la ligne précédente). Si ce n'est pas le cas, nous avons déplacé les doublons précédents et pouvons imprimer la ligne précédente. À la END, nous répétons cela pour la dernière ligne.

8
muru