script unix pour la modification de fichier texte simple

J’ai un fichier qui ressemble à ceci, le format devrait être filename suivi de 4 entrées commençant! …….

76669667-LD_TTFI9255.gz !0c0901$ !02342e$ !0c0901$ !030c2a$ 76669707-UN_TTFI5494.gz !0c0901$ !030509$ 76669731-IN_TTFI7570.gz !0c0901$ !023633$ !0c0901$ !030e33$ 

J’ai besoin d’une commande qui trouve des occasions où il y a moins de 4 entrées après un nom de fichier et ajoute des blancs.

en utilisant l’exemple ci-dessus, la nouvelle production doit devenir

 76669667-LD_TTFI9255.gz !0c0901$ !02342e$ !0c0901$ !030c2a$ 76669707-UN_TTFI5494.gz !0c0901$ !030509$ !? !? 76669731-IN_TTFI7570.gz !0c0901$ !023633$ !0c0901$ !030e33$ 

Merci

En supposant que vous soyez heureux d’utiliser plus que simplement sed, awk ou bash …

Le script Perl suivant fera l’affaire:

 cat input.txt | perl -pe ' if (/^!/) { --$n } else { print "!?\n" x $n if $n > 0 $n = 4 } END { print "!?\n" x $n if $n > 0 }' 
 awk 'BEGIN {counter = 4} /^!/ {counter++; print} /^[^!]/ { for(i = counter; i<4; i++) print "!?"; print; counter=0; } END { for(i = counter; i<4; i++) print "!?"; }' 

Solution pure bash. Pas de duplication de code comme dans les autres réponses 🙂

 #!/bin/bash count=0 while read line do if [[ ! "$line" =~ ^! ]] then for((;count>0;count--)) do echo "!?" done count=4 else ((count--)) fi echo "$line" done < file