Intersection de deux listes en Bash
Je suis en train d'écrire un script simple qui liste le contenu trouvé dans les deux listes. Pour simplifier, nous allons utiliser la commande ls par exemple. Imaginez "un" et "deux" sont des répertoires.
un=`ls d'un` deux=`ls deux intersection $$de l'une des deux
Je suis encore tout vert en bash, donc n'hésitez pas à corriger la façon dont je le fais. J'ai juste besoin de l'aide de la commande imprimer tous les fichiers dans "un" et "deux". Ils doivent exister à la fois. On pourrait appeler cela le "intersection" entre "un" et "deux".
- Rien ici en fait des réponses à la question: comment réaliser l'intersection de deux variables dans un script Bash.
- Semble comme une nouvelle question, à mon avis, cette question est clairement la réponse est ici.
- Un sans doute plus utile est dans le près de en double stackoverflow.com/questions/2312762/...
Vous devez vous connecter pour publier un commentaire.
comm
jusqu'à aujourd'hui. Cela viens de faire ma toute la semaine 🙂comm
requiert que les entrées sont triées. Dans ce cas,ls
trie automatiquement sa sortie, mais d'autres utilisations peuvent avoir besoin pour ce faire:comm -12 <(some-command | sort) <(some-other-command | sort)
public
méthodeerror()
fournis par un trait, en combinaison avecgit grep
, et c'était génial! J'ai couru$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
, et, heureusement, j'ai fini avec le nom du fichier qui contient le trait.Solution avec
comm
comm
est grand, mais en effet besoin de travailler avec une liste triée. Et heureusement, ici, nous utilisonsls
qui, à partir dels
page de manuel de BashAlternative avec
sort
Intersection de deux listes:
différence symétrique de deux listes:
Bonus
Jouer avec elle 😉
Utiliser le
comm
commande:"tri" n'est pas vraiment nécessaire, mais j'ai toujours l'inclure avant à l'aide de "comm" juste au cas où.
Moins efficace (que comm) alternative:
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
ne fait rien, parce que le tri a supprimé les doublons avant uniq commence à regarder pour eux. Je pense que vous n'avez pas compris ce que ma commande est en train de faire.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
de sortie rien non plus. Ma commande devrait lire(ls 1; ls 2) | sort | uniq -d
, sans le-u
, pour afficher la liste intersection. @MikaëlMayer était juste que ma commande d'origine a été brisé.ls
avec quelque chose d'autre, par exemplefind
. Votre solution ne permet pas cela, parce que si l'une des commandes retourne deux lignes le même, il le prend comme un doublon. Le mien fonctionne même si l'utilisateur veut fairels 1/*
et comparez tous les fichiers dans les sous-répertoires. Sinon, oui, il fonctionne aussi bien. Il est possible de la mine est bash-spécifique.Jointure est une autre bonne option en fonction de l'entrée et de la sortie souhaitée
Il y a un autre Stackoverflow question "Tableau intersection de bash," qui est marqué comme un double de cette. Ce n'est pas tout à fait la même, à mon avis, que la question parle de la comparaison de deux tableaux bash, alors que cette question met l'accent sur le coup de fichiers. Une ligne de la réponse à l'autre question, qui est maintenant fermé, est comme suit:
La comm utilitaire ne un tri alphanumérique, alors que la "Matrice d'intersection dans bash" répond à utiliser des nombres; par conséquent, la "tri" et "tri -g" utilisation.