Cette question est fortement liée à ceci et à cette question. J'ai un fichier qui contient plusieurs lignes où chaque ligne est un chemin d'accès à un fichier. Maintenant, je veux coupler chaque ligne avec chaque ligne différente (pas elle-même). De plus, une paire A B
est égale à une B A
paire pour mes besoins, donc une seule de ces combinaisons doit être produite.
Exemple
files.dat
se lit comme ceci dans une notation abrégée, chaque lettre est un chemin de fichier (absolu ou relatif)
a
b
c
d
e
Ensuite, mon résultat devrait ressembler à ceci:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
De préférence, je voudrais résoudre ce problème en bash. Contrairement aux autres questions, ma liste de fichiers est plutôt petite (environ 200 lignes), donc l'utilisation de boucles et de capacité RAM ne pose aucun problème.
Réponses:
Utilisez cette commande:
PROCINFO
peut être unegawk
extension. Si votreawk
ne le prend pas en charge, laissez simplement laPROCINFO["sorted_in"] = "@ind_str_asc"
ligne et canalisez la sortiesort
(si vous voulez que la sortie soit triée).(Cela ne nécessite pas le tri de l'entrée.)
la source
Cela suppose qu'aucune ligne du fichier d'entrée ne contient d'espace. Il suppose également que le fichier est trié .
La
join
commande crée le produit croisé complet des lignes du fichier. Pour ce faire, il joint le fichier avec lui-même sur un champ inexistant. Le non standard-j 2
peut être remplacé par-1 2 -2 2
(mais pas par-j2
sauf si vous utilisez GNUjoin
).La
awk
commande lit le résultat de cette opération et ne produit que des résultats qui sont des paires qui n'ont pas encore été vues.la source
sort -b
ferait le tri.join
nécessitent des fichiers d'entrée triés.Une
python
solution. Le fichier d'entrée est alimenté àitertools.combinations
partir de la bibliothèque standard, qui génère des tuples de 2 longueurs qui sont formatés et imprimés sur la sortie standard.la source
Si vous avez
ruby
installé:-0777
slurp tout le fichier (devrait être correct car il est mentionné dans OP que la taille du fichier est petite)-F'\n'
fractionné en fonction de la nouvelle ligne, de sorte que chaque ligne sera un élément du$F
tableau$F.combination(2)
générer des combinaisons d'2
éléments à la fois{ |c| puts c.join(" ")}
imprimer au besoin$F.uniq.combination(2)
pour 3 éléments à la fois:
Avec
perl
(non générique)Avec
awk
la source
En voici un en coquille pure.
Exemple:
la source
<file.dat xargs test.sh
quetest.sh $(cat file.dat)
En utilisant
Perl
nous pouvons le faire comme indiqué:la source