POSIXツールを使用してファイルの順序を変更しますか?

POSIXツールを使用してファイルの順序を変更しますか?

きれいで明確なPOSIXと同等のものはありますかtac

読みやすさと簡潔さの両方を考慮する必要があります。

答え1

最もクリーンPOSIX等しい

tail -r

〜のように

-r          Reverse. Copies lines from the specified starting point in
            the file in reverse order. The default for r is to print the
            entire file in reverse order.

次回受諾POSIX質問(すぐにすべてのプラットフォームでサポートされることを願っています。)


これが不可能な場合tail -rは(あなたと他の人が実証したように)、「クラシック」テキスト処理ツールを正常に使用してファイルの行を置き換えることができます。
読みやすさと簡潔さはさておき、古いものでさえedこれを行うことができます:

ed -s infile <<\IN
g/^/m0
,p
q
IN

あるいは、パイプの出力を反転するには、まずテキストバッファに読みます。

ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN

答え2

sed「一般人」は読むことはできませんが、次の1行のコードでこれを行うことができます。

sed -n '1h;1!{x;H;};${g;p;}' file.txt

説明する:

-nsed各行の印刷を無効にするデフォルトの動作です。

1h最初の行は予約済みスペースに保存されます。

1!{...}このコマンドブロックをすべての行に適用するとは別に最初に。

xホールド空間とパターン空間を交換します。 (パターンスペースは各行が処理されたときに保存される場所です。)Hその後、改行文字が予約済みスペースに追加され、その後にパターンスペースの(新しい)内容が追加されます。

${...}最後のブロックは、最後の行に達した場合にのみ適用されます。g予約済みスペースの内容を取得し、パターンスペースに入れてpパターンスペースを印刷します。

もちろん、これはファイル全体を一度にメモリに保存できるかどうかによって異なります。非常に大きなファイルでは失敗する可能性があります。

答え3

以下は、ファイル全体をメモリに保存するawkスクリプトです。

awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file

シェル関数で表現すると、次のようになります。

tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }

答え4

POSIX viあなたはいますか?編集するまたは前任者

私は好むとにかく結果を見たい場合は、自分で行うことができます。

もちろん、コマンドモードは次のようになります。

:g/^/m0

ファイル全体を元に戻したくない場合は、コンテンツの移動場所と方法に注意する限り、いつでも:gaの範囲を指定できます。

:1,10g/^/m0

ed以下を使用してスクリプトを作成できます。ex

$ ed -s infile <<IN
g/^/m0
,p
w
IN

そして

$ ex -s infile <<EOS
g/^/move0
wq
EOS

私はいつもこれをする。

「-r」は次に切り替わります。公開時にPOSIXと互換性がありません:

tail [-f] [-c number|-n number] [file]

関連情報