私は私が解決できることに気づきました。この問題行番号を1、2、3、...、nからn、n-1、...、3、2、1に変更し、以前と同じロジックを使用します。では、行の順序を変更する方法を知りたいです。
答え1
tac
(cat
逆方向、さらに含むcoreutils
)cat
はファイルを逆順に並べ替えます。
$ cat /tmp/test
One
Two
Three
$ tac /tmp/test
Three
Two
One
(あなたが言及した特定の問題の場合は、ファイルを追加してファイル全体を元に戻すことができるようにファイル全体を反転するよりも解決策が優れています)
答え2
特定の問題の場合、これは問題を解決する最も効率的な方法ではありませんが、次のいずれかの方法を使用して、さまざまな移植性レベルに逆順に並んだファイルを印刷できます(tac
例:デフォルトでは含まれていないUnix):
sed '1!G;h;$!d' [file]
awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' [file]
perl -e 'print reverse<>' [file]
tac [file]
私のシステムで最も速いのは、次のtac
ようにテストされました。
$ printf '%s\n' {a..z}{a..z}{a..z} > foo
$ time sed '1!G;h;$!d' foo > /dev/null 2>&1
real 0m0.582s
user 0m0.544s
sys 0m0.012s
$ time awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo > /dev/null 2>&1
real 0m0.060s
user 0m0.052s
sys 0m0.008s
$ time perl -e 'print reverse<>' foo > /dev/null 2>&1
real 0m0.021s
user 0m0.016s
sys 0m0.004s
$ time tac foo > /dev/null 2>&1
real 0m0.003s
user 0m0.004s
sys 0m0.000s
...したがっている場合はtac
使用し、そうでない場合はperl
またはを使用してくださいawk
。
答え3
これtac
ユーティリティはラインを反転します。cat
その逆です。
答え4
GNUユーティリティ(Linux、Cygwin)、およびBusyBoxには、tac
テキストファイルの行の順序を変更するコマンドがあります。
そうでないシステムでは、tac
標準コマンドで動作できます。クリスタンの答えファイル全体をメモリに保存してこれを達成するためのいくつかの方法を示します。非常に大きなファイルの場合、影響なくほとんどのuniceで動作する方法はsort
反転することです。これは適切なサイズのファイルには効率的ではありませんが、ソート実装は使用可能なメモリよりも大きなファイルを処理できることがよくあります。
nl | sort -nr | sed 's/.*\t//'
(\t
リテラルタブに置き換えます。)
すでにMichael Mrozekは次のように述べました。、行を置き換えることは、ファイルにデータを追加する恐ろしい方法です。この方法は理解しにくく、さらに多くの作業が必要です。