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