頭の反対は何ですか?ファイルの最初のN行を除くすべてが必要


142

私は読むことができるか、未知の長さのテキストファイル、例えば、すべての与えられたが、ファイルの最初の2行?私が知っているtail私の最後のN行を与えるだろうが、私はNが事前にあるのか分かりません。

だからファイル

AAAA
BBBB
CCCC
DDDD
EEEE

が欲しいです

CCCC
DDDD
EEEE

そしてファイルのために

AAAA
BBBB
CCCC

私はちょうど得ます

CCCC

回答:


211

tail --help 以下を与えます:

  -n, --lines=K            output the last K lines, instead of the last 10;
                           or use -n +K to output lines starting with the Kth

したがって、最初の2行をフィルターで除外するに-n +3は、探している出力を提供する必要があります(3番目から開始)。


2
奇妙なことに、私のマニュアルページにはオプションがリストされていませんが、うまく機能します-ありがとう!
ニコラスMTエリオット

@Nicholas:奇妙なことですが、OSに関係なく標準のドキュメントになると思いました。私はそれをWindows内のCygwinからプルしたので、さまざまなLinuxディストリビューションでどのように見えるかわかりません。うまくいきました。
Joe Enos、2010

@NicholasMTElliott man7は、Joe Enosのマンページのようにリストしているため、マンページのバージョンの問題である可能性があります
UliKöhlerOct

@SteveJorgensen:コメントの意味がわかりません。誰もこれに使用することを提案しているようheadではありませんか?
ruakh

22

テールのバージョンがサポートしている場合、X行の後にテールを開始するように指定できます。あなたの場合、あなたは2 + 1をするでしょう。

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

awkを使用した簡単なソリューション:

awk 'NR > 2 { print }' file.name

私たちの1人は混乱しています。質問は、「ファイルの最初の2行を除くすべて」と述べています。そのコマンドはどのように要件を満たしていないのですか?
janm 2010

6
{ print }デフォルトのアクションであり、省略できます。
tripleee 14

8

お試しくださいsed 1,2d。必要に応じて2を交換してください。


期待どおりに動作しました。最初の2行以降の行数は不明です。
kumarprd 2015年

6

tail -n +linecount filenameラインで出力を開始しますlinecountfilename、そうtail -n +3 filename あなたが欲しいものを行う必要があります。


これは私のシェルでは機能しませんが、機能しtail -n +17 filenameます。私はbash / ubuntu LTSを使用します
同型写像

2
@iso:ヘッドアップをありがとう-の古いバージョンはtail、元の回答で使用した構文を受け入れましたが、今は明示的な-nオプションを使用する必要があります。私はそれに応じて私の答えを更新しました。
ジム・ルイス

0

最初のサンプルがsample1.datと呼ばtail --lines=3 sample1.datれ、3行目から最後の行までのすべての行を出力すると仮定して、これを使用します。

2番目のサンプルの場合も、sample2.datと呼ばれtail --lines=-1 sample2.dat、最後の行を出力します...


@ジム:あなたと私のものの違いは何ですか?....同じこと....:o私は彼の質問に従って2つのサンプルデータファイル入力を参照し、彼が探していたものを達成する方法を示していました... 。
t0mm13b

それでは、なぜ彼は2番目のサンプルを要求し、私が「tail --lines = -1」を使用したかという結果を示したのです...もちろん、ファイル名は完全に省略できます。パイプとして機能できます... hmm
t0mm13b 2010

@tommie:おっと、パイプについて言ったことを忘れてください...私は他のユーティリティを考えていたに違いありません。しかし、私の指摘は、単一のコマンドはtail +3 anyfile、一般的な場合にtail --lines=N望ましい結果を与える一方で、望ましい結果を与えるためにNを事前に知っている必要があるということです。
ジム・ルイス

@tommie:しかし、これはtail...ボトムアップではないのですか?(BA-DUM TISHありがとう、私はここにすべての週になるだろう...!)
ジム・ルイス

0

尾や頭だけでそれを行う方法は本当にわかりませんが、wc -l(行数)とbash式の助けを借りて、それを実現できます。

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

お役に立てれば。


1
これには、tailを実行する前にファイルを完全に渡す必要があります。ファイルがメモリのサイズより大きい場合、これは非常に非効率的です。2行未満のファイルは処理しません。wcと末尾の間でファイルのサイズ変更を処理しません。
janm 2010

2
@janm:大丈夫です。他の答えはちょうど良いです。恥ずかしいです。:-p
NawaMan

-1

awkを使用して最後の2行を除くすべてを取得する

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

最初の2行を除くすべてを取得するawk

awk 'NR>2' file

または、さらに使用できます

more +2 file

またはただバッシュ

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

現在、これは要件を満たしていません。質問は「ファイルの最初の2行以外すべて」と2つの例を示しています。それぞれに1つのファイルがあり、最初の2行はスキップされ、ファイルの残りの部分はstdoutに送信されます。これは、このコマンドが行うことではありません。
janm 2010

はい、質問を読み間違えました。彼は最後の2行を除いてすべてを求めていると思った。
ghostdog74 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.