2 votes

Coller deux fichiers dans le premier fichier

Nous avons ci-dessous deux fichiers :

t1.txt

1
2
3

t2.txt

a
s
d

Je pourrais utiliser :

paste -d"," t1.txt t2.txt > result.txt

et la sortie résultat.txt

1,a
2,s
3,d

Ce qui est parfait, mais je veux faire plus bas :

paste -d"," t1.txt t2.txt > t1.txt

et je m'attendais t1.txt pour être identique à résultat.txt mais c'est comme ci-dessous, pas comme j'en ai besoin :

,a
,s
,d

Je pourrais simplement renommer résultat.txt a t1.txt mais je me demande s'il n'y a pas un meilleur moyen ?

Nota:

  • La solution n'a pas à être paste peut être n'importe quoi tant que l'on évite de créer un fichier temporaire tel que résultat.txt .
  • Réel t1.txt y t2.txt ont chacun 1,6 million de lignes.

5voto

John1024 Points 33528

Utilisation de l'éponge

En sponge a été créé spécialement pour cette tâche :

paste -d, t1.txt t2.txt | sponge t1.txt

sponge fait partie de la moreutils paquet. Sur les systèmes de type debian/ubuntu, exécutez apt-get install moreutils .

Utilisation de mktemp

fname=$(mktemp) && paste -d, t1.txt t2.txt >>"$fname" && mv "$fname" t1.txt

Utilisation d'un fichier temporaire (sans mktemp)

Si on n'a pas accès à l'un ou l'autre mktemp o sponge on peut utiliser :

paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt

Vous avez le choix de l'endroit où placer le fichier temporaire. Dans l'exemple ci-dessus, nous le plaçons dans le répertoire personnel de l'utilisateur, ~/ car cela permet d'éviter les problèmes de sécurité liés à la mise en place de fichiers dans des répertoires du type /tmp .

$$ est l'identifiant du processus. Il est censé être unique, au moins pour la durée de vie du processus.

3voto

glenn jackman Points 69748

La raison pour laquelle le premier fichier disparaît est la suivante :

paste -d"," t1.txt t2.txt > t1.txt
  1. Le shell traite d'abord la redirection, en tronquant le fichier "t1" pour se préparer à recevoir des données. Le fichier est maintenant vide
  2. Maintenant, le shell invoque la commande avec un fichier vide.

Voir la section 3.7.1 du manuel bash inder https://www.gnu.org/software/bash/manual/bash.html#Executing-Commands

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X