À partir d'un certain nombre de fichiers, je dois créer un nouveau fichier dans lequel chaque ligne de texte correspond à la séquence des lignes respectives de mes fichiers d'origine. Donc, disons que j'ai deux fichiers avec une structure comme celle-ci:
Fichier1:
AAAA
BBBB
CCCC
Fichier2:
XXXX
YYYY
ZZZZ
Je dois les combiner pour obtenir un résultat comme:
AAAAXXXX
BBBBYYYY
CCCCZZZZ
Comment puis-je faire cela à partir d'un script bash?
Utilisez la commande paste
:
paste -d '' File1 File2
Par défaut, paste
joint les lignes avec des tabulations. Nous devons donc utiliser l'option -d
pour lui indiquer d'utiliser la chaîne vide pour la jointure.
À travers awk moyen:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
lit la ligne entière de fichier2 et reste dans la variable x .print $0x
imprime la ligne entière de fichier1 en utilisant $0
puis x
qui est la ligne enregistrée de fichier2.paste
est la voie à suivre, mais par souci d'exhaustivité, voici une solution centrée sur bash
(avec un peu d'aide de seq
et wc
):
for _ in $(seq 1 $(wc -l <f1.txt)); do \
read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
Nous envoyons ici le contenu des fichiers f1.txt
et f2.txt
via les descripteurs de fichier 3 et 4. read
lit à partir des FD respectifs et echo
imprime la sortie au format souhaité.
L'itération s'arrête après la fin du f1.txt
, ici _
est une variable à jeter.
Mieux, bash
, dépend de l’état de sortie de read
lorsque le EOF est atteint, avec une construction while
(grâce à steeldriver ):
while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
Exemple:
$ cat f1.txt
AAAA
BBBB
CCCC
$ cat f2.txt
XXXX
YYYY
ZZZZ
$ for _ in $(seq 1 $(wc -l <f1.txt)); do read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ
$ while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ