行1,2,3,4,...,n-1,nから行n,n-1,...,4,3,2,1まで

行1,2,3,4,...,n-1,nから行n,n-1,...,4,3,2,1まで

私は私が解決できることに気づきました。この問題行番号を1、2、3、...、nからn、n-1、...、3、2、1に変更し、以前と同じロジックを使用します。では、行の順序を変更する方法を知りたいです。

答え1

taccat逆方向、さらに含むcoreutilscatはファイルを逆順に並べ替えます。

$ 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は次のように述べました。、行を置き換えることは、ファイルにデータを追加する恐ろしい方法です。この方法は理解しにくく、さらに多くの作業が必要です。

関連情報