J'ai deux corpus parallèles alignés sur des phrases (fichiers texte) avec environ 50 millions de mots. (du corpus Europarl -> traduction parallèle de documents juridiques). Je voudrais maintenant mélanger les lignes des deux fichiers, mais les deux de la même manière. Je voulais aborder cela en utilisant gshuf (je suis sur un Mac) en utilisant une source aléatoire unique.
gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2
Mais j'ai reçu le message d'erreur end of file
, car apparemment la graine aléatoire doit contenir tous les mots que contient le fichier à trier. Est-ce vrai? Si oui, comment créer une graine aléatoire adaptée à mes besoins? Si non, de quelle autre manière pourrais-je randomiser les fichiers en parallèle? J'ai pensé à les coller ensemble, à les randomiser puis à les séparer à nouveau. Cependant, cela semble moche car je devrais d'abord trouver un délimiteur qui ne se produit pas dans les fichiers.
la source
random sources
. En ce qui concernepaste
, vous pouvez utiliser comme délimiteur un caractère de faible ascii qui ne se produira probablement pas dans vos fichiers (comme\x02
,\x03
...).Réponses:
Je ne sais pas s'il existe une méthode plus élégante mais cela fonctionne pour moi:
Résultat:
Mais les fichiers doivent avoir exactement le même nombre de lignes.
La documentation GNU Coreutils fournit également une bonne solution pour l'aléatoire répété en utilisant
openssl
comme générateur aléatoire prédéfini:Cependant, pensez à utiliser une meilleure graine que "42", à moins que vous ne vouliez que quelqu'un d'autre puisse également reproduire "votre" résultat aléatoire.
la source
end of file
erreur ne se produit pas?/dev/null
parcetee
qu'imprime également surstdout
. Peut être utilisé à la> threerandom
place, mais il est plus difficile de l'écrire. Les canaux nommés produiront autant de données aléatoires que nécessaire, vous n'avez donc pas besoin de savoir à l'avance de combien vous aurez besoin.tee
fait ...