grepの一致後にファイル内の行数をカウントするにはどうすればよいですか?


14

csvファイルの問題のある行の後の行数をカウントしようとしています。grep -a #一致が検出された後、#行数を出力する構文を使用できることを認識しています。実際の行数にのみ興味があります。数値をMAX_INTに設定し、それをファイルにパイプして、さらに処理を行うことができることに気付きました。

カウントを伝えるための簡潔なワンライナーを探しています。

助言がありますか?

回答:


15
{ grep -m1 match; grep -c ''; } <file

これはGNU greplseek()有能なinfileで動作します。最初はgrep1つので停止する-mATCH、及び第二のあろう-c入力に残っているすべての行をount。

GNUなしgrep

{ sed '/match/q'; grep -c ''; } <file

もちろん、w / grepあなたは他のオプションのいずれか/すべてを使用することができます、そして1試合で停止することは全く必要ありません。


これらの両方とも行を印刷し、2番目の行は最初の一致まで印刷され、次に0が印刷されますか?
123

@ User112638726- grep -m1 match >/dev/nullもちろん、最初の一致のプリントアウトをドロップできます。2番目の問題はGNU sedです。仕様ごとに入力オフセットをリセットしません。-uGNU を使用する必要があります-これは常に望ましいとは限りません。もっと明確にできたかもしれませんが、私の仮定は、GNU grepとGNU sedはペアで提供されるということでした。私はまた、リダイレクトgrep -qm1を短縮するために働くことができると思います/dev/null-しかし、GNU grepは奇妙なことw /を-q行い、これら2つがどのように連携するか思い出せません。
mikeserv

1
いい答え-コマンドのグループ化の力を実際に示しています。確かでwc -lはありませんが、の場合よりも少し安いと思いgrep -c ''ます。
デジタル外傷

1
@DigitalTrauma-ええ、私は(振り返って)それを考えましたが、私はすでにそれを書いていて、ほとんど韻を踏んでいたので、私は一人で十分にさせようと思いました。とにかく、あなたもそれを言ったので、私は今簡単に眠ります。
mikeserv

9

これが一つの方法です。

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

4
これはcodegolfではありませんが、詳細(FNR、ENDなど)を教えてもらえますか?
アーケマー

3
承知しました。awkはFNRを使用して入力レコード番号を識別します。ENDは、ファイルの最後に到達したときに実行されるコードです。そのため、一致するものが見つかると、現在のレコード番号が記録されます。ファイルの最後に到達すると、その数がファイル内の行の総数から差し引かれます。
スティーブ

1
1つのファイルなのでNRを使用することもできます。
123

6

別の方法-の使用dcは少し難解ですが、ここではうまく機能するようです:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sedprob.txt「問題」と最後の行を検索し、=コマンドを使用して両方の行番号を出力します。

dc これらの2つの値をスタックに読み込み、それらを逆にし、サブラクトし、差を出力します。


5

sedを使用して(パイプを使用した2つのコマンドにもかかわらず)

sed '/ddd/,$!d' file | sed -n '$='

行の前のすべての行を削除し、次のコマンドは新しいファイルの行をカウントします。


3

これにより、問題のある行まで(およびそれを含む)すべての行が削除され、残りの行がカウントされます。

sed '1,/problem/d' data.txt | wc -l

1
(「問題」が最初の行にないことを想定)
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.