web-dev-qa-db-fra.com

Comment puis-je copier et coller des lignes de texte sur différents fichiers dans un script bash?

À 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?

3
Someguy

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.

9
muru

À 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.
2
αғsнιη

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
1
heemayl