Je veux imprimer des lignes d'un fichier en arrière sans utiliser de tac
commande. Existe-t-il une autre solution pour faire une telle chose avec bash?
shell
text-processing
jimmij
la source
la source
Réponses:
Utilisation
sed
pour émulertac
:la source
sed
monoplace. Voir "36. Ordre inverse des lignes (émuler la commande" tac "Unix)." dans Famous Sed One-Liners Explained pour une explication complète de son fonctionnement.sort
- il y a une chance qu'il utilise un fichier temporaire).Avec
ed
:Si vous êtes sur
BSD
/OSX
(et si tout va bien bientôt surGNU
/linux
aussi car ce sera POSIX ):la source
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
via awk one liners
la source
awk 'a=$0RS a{}END{printf a}'
but your first
perl reverse <> `c'est la meilleure / la plus rapide réponse sur la page (pour moi), à 10 fois plus rapide que cetteawk
réponse (tous les awk anseres sont à peu près les mêmes, dans le temps)awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Comme vous l'avez demandé en bash, voici une solution qui n'utilise pas awk, sed ou perl, juste une fonction bash:
La sortie de
est
Comme prévu.
Mais attention, les lignes sont stockées en mémoire, une ligne dans chaque instance appelée récursivement de la fonction. Si prudent avec les gros fichiers.
la source
Vous pouvez le diriger à travers:
Les
awk
préfixes de chaque ligne avec le numéro de ligne suivi d'un espace. L'sort
inverse l'ordre des lignes en triant le premier champ (numéro de ligne) dans l'ordre inverse, style numérique. Et lessed
bandes des numéros de ligne.L'exemple suivant montre cela en action:
Il génère:
la source
cat -n
agit commeawk '{print NR" "$0}'
En perl:
la source
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
c'est rapide: bon! mais le "vraiment moche" est extrêmement lent car le nombre de lignes augmente. !! ....-n
était superflu là-bas, merci.sort
).Solution BASH uniquement
lire le fichier dans le tableau bash (une ligne = un élément du tableau) et imprimer le tableau dans l'ordre inverse:
la source
while..read
.IFS=''
etread -r
pour empêcher toutes sortes de fuites et de retrait IFS de fuite de le visser. Je pense que le bashmapfile ARRAY_NAME
builtin est une meilleure solution pour lire dans les tableaux.Bash, avec
mapfile
mentionné dans les commentaires de fiximan, et en fait une version peut-être meilleure:Ses performances sont fondamentalement comparables à la
sed
solution et deviennent plus rapides à mesure que le nombre de lignes demandées diminue.la source
la source
comme indiqué ici:
Résultat:
la source
la source