Existe-t-il une approche simple à une ligne pour combiner la sortie d’une commande unix avec un fichier?

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.