Rediriger une commande cat lors de l'utilisation de caractères génériques en tant qu'entrée


0

J'ai la commande suivante qui prend une certaine partie d'un fichier dans le répertoire actuel, l'écrit dans un fichier temporaire, récupère une partie d'un autre fichier d'un répertoire vers le haut, l'écrit dans un fichier temporaire, puis concatène finalement ces deux fichiers temporaires en un et le renvoie à result:

sed -e '3003,$d' file1 > temp1;sed -n '3,$p' ../otherfile1 > temp2; cat temp1 temp2 > ../result1

Cela fonctionne pour un fichier, mais maintenant je veux le faire dans un répertoire entier.

Je pensais que l'utilisation d'un caractère générique dans la commande sed fonctionnerait:

sed -e '3003,$d' file* > temp1;sed -n '3,$p' ../otherfile* > temp2; cat temp1 temp2 > ../result*

mais bien entendu, il ne sait pas automatiquement comment numéroter les fichiers temporaires et le fichier de sortie.

Comment utiliser cette commande sur un répertoire entier, en générant un fichier de résultat unique pour chaque concaténation?

Réponses:


2

Faites-le comme une boucle dans un shell bash plutôt que de transmettre la liste complète à sed.

let "n = 1"
for file in *
do
  sed -e '3003,$d' $file > temp1;sed -n '3,$p' ../$file > temp2; cat temp1 temp2 > ../result${n} ;
  let "n = n + 1"
done

Comment changer le nom du fichier de résultat pour chaque itération? Mon but est d'obtenir result1, result2, result3 , etc. With the current loop it overwrites the fichier result1`.
Saaru Lindestøkke

1

En utilisant un sous-shell, on peut même éviter les fichiers "temp1" et "temp2". De plus, si les noms de fichiers contiennent des espaces, j'ai tendance à utiliser "while":

n = 1
ls | en lisant f; faire
  (sed -e '3003, $ d' $ f && sed -n '3, $ p' ../$f)> ../result${n}
  n = $ ((n + 1))
terminé

Soigné. Je n'y ai pas pensé, mais une bonne solution à son problème. J'ai aussi remarqué les calculs d'expansion de la coquille - j'aime toujours être explicite cependant :)
Tony Williams

Tu veux dire le truc "((...))"? J'ai fait cela pour éviter le bashisme de "laisser", car ce n'est pas portable.
Ckujau

Oui, c'est ce que je voulais dire. Je suis tellement idiot en math que je préfère l'épeler :)
Tony Williams
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.