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?

24
demandé sur kenorb 2009-01-07 00:38:25

8 réponses

45
répondu Vinko Vrsalovic 2009-01-06 21:43:22

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<>'
20
répondu Hynek -Pichi- Vychodil 2010-05-07 08:16:32

Il y a un standard commande pour votre but:

tail -r file.txt

imprime les lignes du fichier.txt dans l'ordre inverse!

18
répondu porg 2011-11-14 17:13:39
cat -b uniquement les numéros de lignes non vides contenues"



Si c'est le seul problème que vous voulez éviter, alors pourquoi ne pas utiliser "cat-n" pour numéroter toutes les lignes?

2
répondu 2009-01-20 17:32:11
:   "@(#)$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...

1
répondu Jonathan Leffler 2009-01-06 23:26:52

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 <>'
1
répondu Gavin Brock 2010-05-06 02:40:26

Dans ce cas, il suffit d'utiliser --reverse:

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
1
répondu OJFord 2016-05-26 20:53:24
rev <name of your text file.txt>

Vous pouvez même le faire:

echo <whatever you want to type>|rev
0
répondu kcidkcus 2016-05-26 20:48:41