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?

Saaru Lindestøkke
la source

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
Tony Williams
la source
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é
Ckujau
la source
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