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?
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.