29

テキスト ファイルの行を反転する必要がある小さなシェル スクリプトを作成しています。この種のことを行うための標準フィルター コマンドはありますか?

私の特定のアプリケーションは、Git コミット識別子のリストを取得していて、それらを逆の順序で処理したいということです。

git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse

私が思いついた最善の方法は、次のreverseように実装することです。

... | cat -b | sort -rn | cut -f2-

これはcat、すべての行に番号を付けてからsort、降順で並べ替え (ファイル全体を逆にすることになります)、cut不要な行番号を削除するために使用します。

上記は私のアプリケーションでは機能しますが、cat -b空白以外の行にのみ番号を付けるため、一般的なケースでは失敗する可能性があります。

これを行うためのより良い、より一般的な方法はありますか?

4

9 に答える 9

55

GNU coreutilsにはtac (1)があります

于 2009-01-06T21:43:22.680 に答える
27

あなたの目的のための標準的なコマンドがあります:

tail -r file.txt

file.txtの行を逆の順序で出力します!

于 2011-11-14T17:13:39.850 に答える
23

答えは 42 ではなくtac.

編集:遅くなりますが、より多くのメモリを消費しますsed

sed 'x;1!H;$!d;x'

そしてさらに長い

perl -e'print reverse<>'
于 2009-01-06T21:40:39.410 に答える
2

上記のsedの例と同様に、perlを使用すると、記憶に残りやすくなります (脳の配線方法によって異なります):

perl -e 'print reverse <>'
于 2010-05-06T02:40:26.357 に答える
2
cat -b は非空白行のみに番号を付ける」


それが回避したい唯一の問題である場合は、「cat -n」を使用してすべての行に番号を付けてみませんか?

于 2009-01-20T17:32:11.710 に答える
1

この場合、次を使用します--reverse

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
于 2016-05-26T20:53:24.373 に答える
1
:   "@(#)$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, $0);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'

私にとって魅力のように機能します...

于 2009-01-06T23:26:52.863 に答える
0
rev <name of your text file.txt>

これを行うこともできます:

echo <whatever you want to type>|rev
于 2016-05-26T20:36:38.483 に答える