J'ai le fichier suivant:
AA,true
AA,false
BB,false
CC,false
BB,true
DD,true
J'essaie de rechercher des doublons et de supprimer la ligne dont la valeur de colonne est égale à true
.
en sortie, il devrait être:
AA,false
BB,false
CC,false
DD,true
text-processing
awk
sed
Hani Gotc
la source
la source
true
si c'est la première instance de la première colonne?AA,true AA,false AA,false AA,false
Quelle sortie devrait être dans ce cas? Je comprends que cette ligne ne doit être supprimée que si elle contient des doublons et contienttrue
en même temps. Dans tous lesfalse
cas, toutes les lignes doivent rester intactes. Autrement dit, dans ce cas, seulAA, true
sera supprimé. Mais toutes les réponses ne laissent qu'une seule ligne -AA,false
. Juste intéressant :)Réponses:
Pour développer le script verticalement pour explication:
la source
Version simple:
"false" trie alphabétiquement avant "true", et la commande Awk ici ne conserve que la première ligne pour chaque première valeur de champ distincte.
Si vous souhaitez conserver "true" au lieu de "false", inversez-le, passez-le à la même commande Awk et inversez-le à nouveau par la suite.
la source
-u
option est disponible,sort input.txt | sort -t, -u -k1,1
sort
appels? Pourquoi pas justesort -ut, -k1,1 input.txt
?-u
conservera la première ligne trouvée dans le fichier d'entrée parmi les doublons ... pour un cas donné, l'entrée doit être triée avant de-u
pouvoir être appliquée ... par exemple:AA,true
sera imprimée au lieu deAA,false
car elle apparaît en premier dans l'échantillon donné. même raison pour laquelleawk -F, '!a[$1]++'
seul ne résoudra pas ce problèmeStructures de données:
%h
dont les clés sont des premiers champs (AAA, BBB, CCC, etc.) et les valeurs correspondantes sont des nombres indiquant l'ordre dans lequel les clés ont été rencontrées. Ainsi, par exemple, clé AAA => 0, clé BBB => 1, clé CCC => 2.@h
dont les éléments sont des lignes contenues dans l'ordre d'impression. Donc, si à la fois vrai et faux sont trouvés dans les données, la fausse valeur ira dans le tableau. OTW, s'il y a un type de données, alors ce serait présent.Une autre façon utilise GNU sed:
FWIW, le code équivalent POSIX pour le code GNU-sed ci-dessus est répertorié ci-dessous:
Explication
Résultats
la source
Pour chaque ligne d'entrée, stockez la valeur du deuxième champ dans un tableau associatif
a
(en utilisant le premier champ comme clé du tableau) UNIQUEMENT si nous n'avons pas déjà stocké la valeurfalse
de cette clé. À utiliser,
pour le séparateur de champ d'entrée et de sortie. Imprimez le tableau après avoir lu toutes les lignes d'entrée.La différence significative entre cela et la version de DopeGhoti est que cette version ne se soucie pas du tout de la valeur de
$2
, elle ne se soucie que de la valeur, le cas échéant, dea[$1]
.la source
sort
Solution en deux passessort
Passez d' abord les enregistrements de clusters par champ1
avec lesfalse
enregistrements précédanttrue
pour chaque bloc d'enregistrements partageant une1
valeur de champ commune . La deuxièmesort
passe est configurée pour produire un enregistrement pour chaque valeur distincte dans le champ1
avec la permission du-u
. Puisque-u
implique un tri stable, le seul enregistrement ainsi produit est le premier enregistrement rencontré pour chaque valeur distincte dans le champ1
- qui est un enregistrement avecfalse
dans le deuxième champ en raison du travail effectué par la premièresort
passela source