web-dev-qa-db-fra.com

Répétez chaque ligne plusieurs fois

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.

20
Yimin Rong
  • 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
    
20
terdon

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 $_;
}
34
glenn jackman
sed -n '{p;p;p;p;}' file

awk '{print;print;print;print;}' file
4
Hauke Laging

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.

1
potong

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
1
Jan Kos

En utilisant purement shell:

repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile
1
user176581