Je souhaite combiner l’en-tête d’un fichier texte avec un autre fichier texte. Je sais que je peux le faire avec
head -n1 file1.txt > header.txt cat header.txt file2.txt > file2_withHeader.txt
mais cela génère un fichier intermédiaire inutile et deux étapes. Y a-t-il un moyen d’en faire une étape sans générer un fichier intermédiaire?
Je pensais à ça
cat $(head -n1 file1.txt) file2.txt > file2_withHeader.txt
mais ça ne marche pas car $(head -n1 file1.txt)
n’est pas un fichier donc il ne peut pas concaténer.
Merci
Les trois autres réponses à cette question sont bonnes, et puisque chacune répond différemment, ce serait un bon exercice pour apprendre chacune. Chaque fois que LC-datascientist et la réponse de Diego génèrent un sous-shell, l’ approche à deux lignes de λuser , peut-être avec &&
entre les deux commandes, est la plus idéale.
Si vous le voulez vraiment dans une seule commande qui ne lance pas de sous-shell, vous pouvez utiliser awk
(mawk):
awk 'BEGIN { getline < file1.txt; print } 1' file2.txt
gawk
peut le faire encore plus élégamment grâce à la commande nextfile
:
gawk '1; NR == FNR { nextfile }' file1.txt file2.txt
Celles-ci font la même chose: la première ligne de file1.txt et l’imprime, puis imprime la totalité de fichier2.txt.
Le code mawk
utilise getline
pour lire une seule ligne à partir d'une entrée donnée dans $0
(dans ce cas, voir la page de manuel), nous pouvons le faire avant de lire file2.txt. 1
est vrai, donc cette deuxième clause se déclenche toujours, déclenchant l'action par défaut ( print $0
).
Le code gawk
s’imprime d’abord, puis utilise NR == FNR
pour déterminer que vous regardez le premier fichier (le nombre total d’enregistrements (lignes) et le nombre d’enregistrements du fichier en cours sont identiques), auquel cas il est déjà temps pour passer au second fichier.
Pour les trois premières lignes, mawk
besoin d'une boucle:
awk 'BEGIN { for (i=0;i<3;i++) { getline < file1.txt; print } } 1' file2.txt
et gawk
simplement besoin d'une autre condition:
gawk '1; NR == FNR && NR >= 3 { nextfile }' file1.txt file2.txt
Vous pouvez réellement append aux redirections:
head -n1 file1.txt > result.txt cat file2.txt >> result.txt
en bash
tu peux aussi faire
cat <(head -n 1 file1.txt) file2.txt > file2_withHeader.txt
ce que je pense que vous cherchiez.
Merci, λuser. C’est une option que je peux faire aussi.
En fait, je viens juste de trouver le one-liner que j’espérais.
(head -n1 file1.txt; cat file2.txt) > file2_withHeader.txt
Désolé, j’ai réalisé que c’était la même question que d’autres demandant de combiner deux commandes dans Unix, donc cela a été répondu.