回答:
これを使用して、最初の 2行を削除できます。
tail -n +3 foo.txt
最後の 2行を削除するには、次のようにします。
head -n -2 foo.txt
(ファイルの末尾が\n
後者の場合)
ただの標準的な使用のために好きtail
とhead
これらの操作は破壊的ではありません。>out.txt
出力を新しいファイルにリダイレクトする場合に使用します。
tail -n +3 foo.txt >out.txt
out.txt
すでに存在する場合、このファイルは上書きされます。出力をに追加する場合の>>out.txt
代わりに使用>out.txt
しout.txt
ます。
最初のN-1行を除くすべての行が必要な場合tail
は、行数で呼び出します+N
。(番号は、保持する最初の行の番号で、1から始まります。つまり、+ 1は先頭から始まり、+ 2は1行スキップすることを意味します)。
tail -n +3 foo.txt >>other-document
最後のN行をスキップする簡単でポータブルな方法はありません。GNU head
はhead -n +N
、の対応物として許可していtail -n +N
ます。それ以外の場合tac
(GNUやBusyboxなど)がある場合は、tailと組み合わせることができます。
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))"
ファイルの先頭を切り捨てることはできませんが、巨大なファイルの最初の数行を削除する必要がある場合は、コンテンツを移動できます。
tail
(GNU manページtail
で、):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
したがって、次はsomefile.txt
toの最初の2行を除くすべてを追加する必要がありますanotherfile.txt
。
tail --lines=+3 somefile.txt >> anotherfile.txt
最初のn行を削除するには、GNU sedを使用できます。たとえば、n = 2の場合
sed -n '1,2!p' input-file
!
平均値は「この間隔を除外する」。あなたが想像できるように、例えば、より複雑な結果を得ることができます
sed -n '3,5p;7p'
行3、4、5、7が表示されます。アドレスの代わりに正規表現を使用することで、より強力になります。
制限は、行番号が事前にわかっている必要があることです。
一方でtail -n +4
出力する第4ライン(すべてが、最初の3行)で始まるファイルは、標準およびポータブルで、そのhead
カウンターパート(head -n -3
、すべてが、最後の3行は)ないです。
移植性のある、あなたがするだろう:
sed '$d' | sed '$d' | sed '$d'
または:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(一部のシステムでsed
は、サイズが制限されているパターンスペースがあり、大きな値にスケーリングされないことに注意してくださいn
)。
または:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
私はあなたの必要性を明確に理解したいと思います。
リクエストを完了する方法はいくつかあります。
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
どこで/ etc / passwdファイルは、あなたのファイルです
2番目の解決策は、巨大なファイルがある場合に便利です。
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
" .. (head:(GNU coreutils)7.4を使用)のように、何も-n -0
返さない以外のすべての負の整数で動作します-n 0
...しかし、末尾\n
が存在する場合、-n -0
印刷しますから予想されるように-
、すなわち。それはファイル全体を印刷し...だから、すべての非ゼロの負の値のために働くん..しかし、-0
末尾がない場合に失敗する\n