sort | uniq | xargs grep ... où les lignes contiennent des espaces
J'ai un fichier délimité par des virgules "monfichier.csv" où la 5ème colonne est un timbre de date/heure. (mm/jj/aaaa hh:mm). j'ai besoin de la liste de toutes les lignes qui contiennent des doublons de dates (il y en a beaucoup)
Je suis en utilisant un shell bash via cygwin pour WinXP
$ cut -d, -f 5 myfile.csv | sort | uniq -d
correctement renvoie une liste des doubles dates
01/01/2005 00:22
01/01/2005 00:37
[snip]
02/29/2009 23:54
Mais je ne peux pas comprendre comment nourrir ce grep pour me donner toutes les lignes.
Évidemment, je ne peux pas utiliser xargs
droite depuis la sortie contient des espaces. J'ai pensé que je pouvais faire uniq -z -d
mais pour une raison quelconque, la combinaison de ces drapeaux causes uniq pour (apparemment) renvoie rien.
Donc, étant donné que
$ cut -d, -f 5 myfile.csv | sort | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv
ne fonctionne pas... que puis-je faire?
Je sais que je pourrais le faire dans perl
ou un autre langage de script... mais mon entêtement insiste sur le fait que je devrais être capable de le faire dans bash
standard en utilisant des outils en ligne de commande comme sort
, uniq
, find
, grep
, cut
, etc.
apprends-moi, oh bash gourous. Comment puis-je obtenir la liste des lignes j'ai besoin d'aide typiques des outils cli?
OriginalL'auteur Sukotto | 2009-03-04
Vous devez vous connecter pour publier un commentaire.
Problème est que si vous avez les champs après les #5 qui sont différents. Vos dates sont tous de la même longueur? Vous pourriez être en mesure d'ajouter un-w 16 (notamment en temps), ou -w 10 (juste pour les dates), à l'uniq.
Donc:
OriginalL'auteur Andrew Barnett
La
-z
option deuniq
besoins de l'entrée pour être NUL séparés. Vous pouvez filtrer la sortie decut
par:Pour obtenir zéro séparés lignes. Puis
sort
,uniq
etxargs
avoir des options pour gérer cela. Essayez quelque chose comme:Edit: la position de
tr
dans la conduite était mauvaise.OriginalL'auteur kmkaplan
Essayer de s'échapper de la espaces avec sed:
(Encore une autre façon serait de lire la double date de lignes dans un IFS=$'\n' tableau et l'itération d'une boucle for.)
OriginalL'auteur
Vous pouvez dire xargs utilisation de chaque ligne comme un argument dans son intégralité à l'aide de l'option-d de. Essayez:
OriginalL'auteur Andru Luvisi
C'est un bon candidat pour awk:
OriginalL'auteur porges