Souhaiterait que chaque ligne d'un fichier soit répétée un nombre fixe de fois.
Par exemple, faites répéter chaque ligne quatre fois:
a
b
c
devient:
a
a
a
a
b
b
b
b
c
c
c
c
J'ai fait quelques recherches, et il y a beaucoup de questions et réponses dans le sens inverse, par exemple la fusion de lignes en double en lignes simples, et peut-être quelques-unes sur le doublage des lignes en les imprimant à nouveau.
Ce serait facile de le faire en C, mais j'aimerais en savoir plus sur les commandes natives pour ne pas avoir à recourir à ce genre de lancers ponctuels tout le temps.
text-processing
sed
awk
perl
Yimin Rong
la source
la source
awk
« sfor
doit pas accolades s'il n'y a qu'une seule commande à répéter. Etperl
est plus simple si vous utilisez laforeach
boucle:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Vous devez également citer$line
(en écho) dans votre version bash.BEGIN { ORS="\r\n" }
Je me demande si cela se transforme en match de golf :
Explication:
La
p
commande de sed est d'imprimer la ligne courante. Le comportement par défaut consiste à imprimer la ligne actuelle juste avant de passer à la ligne suivante (c'est pourquoi sed doit-n
vous permettre de la désactiver). Certains anciens seds n'ont pas le point-virgule (je pense), il est donc possible que vous deviez fairesed -e p -e p -e p
Awk fonctionne avec des
condition {action}
paires. Si l'action est omise, la valeur par défaut est d'imprimer la ligne actuelle si la condition renvoie true. Awk, comme de nombreux langages de type C, est considéré1
comme vrai. (Pour être complet, si la condition est omise, l'action sera exécutée pour chaque enregistrement.)De nombreuses fonctions perl profitent de la variable "default". Ce one-liner est équivalent à (sur perl 5.16):
la source
1
awk? Sténographie pourprint $0
?1
(true); le bloc par défaut est équivalent à{print}
. Donc, l'instruction1
signifierait imprimer le tampon de ligne actuel ({print}
). ({print}
et{print $0}
sont pour la plupart les mêmes, qed.)sed
qui ne prend pas en charge les points-virgules comme terminateurs de commande; existe-t-il vraiment une telle chose?la source
Vous pouvez le faire sans qu'il soit nécessaire
sed
,perl
ouawk
.ou en utilisant une boucle while:
Exemples
pour boucle en bouclela source
Utilisation purement shell:
la source
--help
comme une chaîne plutôt qu'une option? [considérez le cas oùline
est--help
ou une autre option]yes -- --help
yes
ethead
signifie que ce n'est pas "purement shell"Cela pourrait fonctionner pour vous (GNU sed):
Répétera chaque ligne 4 fois.
Ou si vous préférez:
Où vous répétez chaque ligne 3 fois de plus.
la source
La réponse de @potong ne fonctionne pas avec des lignes vides, le remplacer
\+
par*
devrait le corriger:la source