J'ai deux fichiers parallèles avec le même nombre de lignes dans deux langues et je prévois de fusionner ces deux fichiers ligne par ligne avec le délimiteur |||
. Par exemple, les deux fichiers sont les suivants :
Fichier A :
1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 1,3 I am hungry.
Hi 1,4 I am foolish.
Fichier B :
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 1,3 Ich habe Durst.
Hi 1,4 Ich bin neu.
La sortie attendue ressemble à ceci :
1Mo 1,1 I love you. ||| 1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. ||| 1Mo 1,2 Ich mag dich.
Hi 1,3 I am hungry. ||| Hi 1,3 Ich habe Durst.
Hi 1,4 I am foolish. ||| Hi 1,4 Ich bin neu.
J'ai essayé le paste
commande telle que :
paste -d "|||" fileA fileB
Mais la sortie renvoyée ne contient qu'un seul tube tel que :
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
Existe-t-il un moyen de séparer chaque paire de lignes par tripe pipe |||
?
Réponse acceptée :
Avec le collage POSIX :
:|paste -d ' ||| ' fileA - - - - fileB
paste
concaténera les lignes correspondantes de tous les fichiers d'entrée. Ici, nous avons six fichiers, fileA
, quatre fichiers factices du standard en -
, et fileB
.
La liste des délimiteurs comprend un espace, trois tubes et un espace dans cet ordre sera utilisé par paste
circulairement.
Pour la première ligne de six fichiers, fileA
sera concaténé avec le premier fichier factice (qui n'est rien, grâce à l'opérateur no-op :), produire line1-fileA<space>
.
Le premier fichier factice sera concaténé avec le second par un tube, produire line1-fileA |
, puis le deuxième fichier factice avec le troisième fichier factice, produisent line1-fileA ||
, le troisième fichier factice avec le quatrième fichier factice, produit line1-fileA |||
.
Et le quatrième fichier factice avec fileB
, produit line1-fileA ||| line1-fileB
.
Ces étapes seront répétées pour toutes les lignes, vous donneront le résultat attendu.
L'utilisation de :|
est pour moins de saisie et principalement utilisé dans un shell interactif. Dans un script, vous devez utiliser :
</dev/null paste -d ' ||| ' fileA - - - - fileB
pour empêcher un sous-shell d'être généré.