「尾」と「頭」の反対の動作を取得するには?

「尾」と「頭」の反対の動作を取得するには?

文書に何行があるかわからないので、文書を逆方向に出力するhead方法はありますか?tail

foo.txtつまり、最初の2行を除くすべての内容を別の文書に追加したいと思います。

答え1

これを利用して剥がしてください。最初2行:

tail -n +3 foo.txt

これは脱皮用です。最後実装でheadサポートされている場合は2行:

head -n -2 foo.txt

(ファイルが\n後者で終わると仮定)


標準的な使用法と同様に、tailこれらのhead操作は破壊的ではありません。>out.txt出力を新しいファイルにリダイレクトするには、次のようにします。

tail -n +3 foo.txt >out.txt

すでに存在する場合はout.txtファイルを上書きします。出力>>out.txtを。>out.txtout.txt

答え2

最初のN-1行を除くすべての行が必要な場合は、tailnumber oflinesを呼び出します+N。 (数字は最初に保持したい行の行番号です。1から始まります。つまり、+1は一番上から始まり、+2は行をスキップすることを意味します。)

tail -n +3 foo.txt >>other-document

最後のN行をスキップする簡単で移植可能な方法はありません。 GNUはasをhead受け入れます。そうでない場合(たとえば、GNUまたはBusybox)、これをテールと組み合わせることができます。head -n +Ntail -n +Ntac

tac | tail -n +3 | tac

移植可能なawkフィルタ(テストされていない)を使用できます。

awk -vskip=2 '{
    lines[NR] = $0;
    if (NR > skip) print lines[NR-skip];
    delete lines[NR-skip];
}'

大きなファイルから最後の数行を削除するには、切り取りたいセクションのバイトオフセットを決定し、切り取りを使用できますdd

total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"

ファイルを最初から切り取ることはできませんが、大容量ファイルの最初の数行を削除する必要がある場合は、次のようにします。モバイルコンテンツ

答え3

最初のn行を削除するには、GNU sedを使用できます。たとえば、n = 2の場合

sed -n '1,2!p' input-file

これは「この範囲を除外する」という意味です!。想像できるように、より複雑な結果を得ることができます。

sed -n '3,5p;7p'

行3,4,5,7が表示されます。アドレスの代わりに正規表現を使用すると、より多くのパフォーマンスが得られます。

制限は、行番号を事前に知っておく必要があることです。

答え4

{   head -n2 >/dev/null
    cat  >> other_document
}   <infile

もし<infile正規、lseek()-ableファイルなら、はい、何でも構いません。上記は完全にPOSIXをサポートする構成です。

関連情報