質問

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

特定のアプリケーションでは、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 は非空白行のみに番号を付けるため、一般的なケースでは失敗する可能性があります。

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

役に立ちましたか?

他のヒント

Answerは42ではなく、 tac です。

編集: sed

を使用すると、速度は遅くなりますが、より多くのメモリが消費されます
sed 'x;1!H;$!d;x'

さらに長い

perl -e'print reverse<>'

目的には標準コマンドがあります:

tail -r file.txt

file.txtの行を逆順に印刷します!

cat -b空白でない行のみに番号を付ける&quot;


それがあなたが避けたい唯一の問題であるなら、なぜ&quot; cat -n&quot;を使わないのかすべての行に番号を付けますか?

:   "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp <*>quot;
#
#   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]*://'

私にとって魅力のように動作します...

上記の sed の例と同様に、 perl を使用します-より記憶に残るかもしれません(脳の配線方法によって異なります):

perl -e 'print reverse <>'

この場合、単に-reverse を使用します:

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>

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

echo <whatever you want to type>|rev
awk '{a[i++]=<*>}END{for(;i-->0;)print a[i]}'

sed よりも高速で、openwrtなどの埋め込みデバイスと互換性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top