Comment inverser les lignes d'un fichier texte?
j'écris un petit script shell qui doit inverser les lignes d'un fichier texte. Est-il un filtre standard de commande pour faire ce genre de chose?
mon application spécifique est que je reçois une liste d'identificateurs de propagation Git, et je veux les traiter dans l'ordre inverse:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
Le meilleur que j'ai trouvé est de mettre en œuvre reverse
comme ceci:
... | cat -b | sort -rn | cut -f2-
cat
pour numéroter chaque ligne, puis sort
pour les trier en décroissant numérique ordre (qui finit par inverser tout le fichier), puis cut
pour supprimer le numéro de ligne non nécessaire.
ce qui précède fonctionne pour mon application, mais peut échouer dans le cas général parce que cat -b
seulement les nombres lignes non-blanches.
y a-t-il une meilleure façon, plus générale, de faire cela?
8 réponses
Réponse n'est pas 42 mais tac
.
Edit: plus lent mais plus consommateur de mémoire en utilisant sed
sed 'x;1!H;$!d;x'
et plus encore
perl -e'print reverse<>'
Il y a un standard commande pour votre but:
tail -r file.txt
imprime les lignes du fichier.txt dans l'ordre inverse!
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, );}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
Fonctionne comme un charme pour moi...
semblable au sed exemple ci-dessus, en utilisant perl - peut-être plus mémorable (selon la façon dont votre cerveau est branché):
perl -e 'print reverse <>'
Dans ce cas, il suffit d'utiliser --reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
Vous pouvez même le faire:
echo <whatever you want to type>|rev