テキストファイルの行を反転する方法は?
-
03-07-2019 - |
質問
テキストファイルの行を反転する必要がある小さなシェルスクリプトを書いています。このようなことを行うための標準のフィルターコマンドはありますか?
特定のアプリケーションでは、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
は非空白行のみに番号を付けるため、一般的なケースでは失敗する可能性があります。
これを行うより良い、より一般的な方法はありますか?
解決
GNU coreutils には、 tac(1)
他のヒント
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などの埋め込みデバイスと互換性があります。
所属していません StackOverflow