Aimerait avoir chaque ligne dans un fichier répété un nombre de fois fixe.
par exemple. avoir chaque ligne répétée quatre fois:
a
b
c
devient:
a
a
a
a
b
b
b
b
c
c
c
c
J'ai fait des recherches et il y a beaucoup de questions et de réponses dans le sens de l'inverse, par exemple. Fusionner des lignes en double en lignes simples, et peut-être quelques-unes sur des lignes de doublage en les imprimant à nouveau.
Il serait facile de le faire en C, mais j'aimerais connaître davantage les commandements indigènes, je n'aurais donc pas besoin de recourir à ces types de jetons unique.
Perl:
Perl -ne 'for$i(0..3){print}' file
et je dois ajouter celui-ci posté sous forme de Commentaire par @derobert car il est juste cool:
Perl -ne 'print "$_" x4'
awk
et variantes:
awk '{for(i=0;i<4;i++)print}' file
bash
while read line; do for i in {1..4}; do echo "$line"; done; done < file
Je me demande si cela se transforme en un golf match:
sed 'p;p;p'
awk '1;1;1;1'
Perl -lpE 'say;say;say' # if Paul McCartney and Michael Jackson were hackers...
Explication:
la commande de SED's p
est d'imprimer la ligne actuelle. Le comportement par défaut consiste à imprimer la ligne actuelle juste avant de passer à la ligne suivante (c'est pourquoi SED a -n
Pour vous permettre de l'éteindre). Certains SED plus âgés n'ont pas le point-virgule (je pense), il est donc possible que vous puissiez avoir à faire sed -e p -e p -e p
Awk fonctionne avec condition {action}
paires. Si l'action est omise, la valeur par défaut est d'imprimer la ligne en cours si la condition renvoie true. Awk, comme de nombreuses langues de type C, traite 1
comme vrai. (Pour une exhaustivité, si la condition est omise, l'action sera exécutée pour chaque enregistrement.)
De nombreuses fonctions Perl profitent de la variable "Par défaut". Cette doublure est équivalente à (sur Perl 5.16):
$ Perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
say $_;
say $_;
say $_;
}
continue {
die "-p destination: $!\n" unless print $_;
}
sed -n '{p;p;p;p;}' file
awk '{print;print;print;print;}' file
Cela pourrait fonctionner pour vous (GNU SED):
sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file
Répétera chaque ligne 4 fois.
Ou si vous préférez:
sed 'h;:a;s/\n/&/3;t;G;ba' file
Où vous répétez chaque ligne 3 fois de plus.
La réponse de Potong ne fonctionne pas avec des lignes vides, remplaçant \+
avec *
devrait le réparer:
sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
En utilisant purement shell:
repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile