csvファイルの問題のある行の後の行数をカウントしようとしています。grep -a #一致が検出された後、#行数を出力する構文を使用できることを認識しています。実際の行数にのみ興味があります。数値をMAX_INTに設定し、それをファイルにパイプして、さらに処理を行うことができることに気付きました。
カウントを伝えるための簡潔なワンライナーを探しています。
助言がありますか?
csvファイルの問題のある行の後の行数をカウントしようとしています。grep -a #一致が検出された後、#行数を出力する構文を使用できることを認識しています。実際の行数にのみ興味があります。数値をMAX_INTに設定し、それをファイルにパイプして、さらに処理を行うことができることに気付きました。
カウントを伝えるための簡潔なワンライナーを探しています。
助言がありますか?
回答:
{ grep -m1 match; grep -c ''; } <file
これはGNU grepとlseek()有能なinfileで動作します。最初はgrep1つので停止する-mATCH、及び第二のあろう-c入力に残っているすべての行をount。
GNUなしgrep:
{ sed '/match/q'; grep -c ''; } <file
もちろん、w / grepあなたは他のオプションのいずれか/すべてを使用することができます、そして1試合で停止することは全く必要ありません。
grep -m1 match >/dev/nullもちろん、最初の一致のプリントアウトをドロップできます。2番目の問題はGNU sedです。仕様ごとに入力オフセットをリセットしません。-uGNU を使用する必要があります-これは常に望ましいとは限りません。もっと明確にできたかもしれませんが、私の仮定は、GNU grepとGNU sedはペアで提供されるということでした。私はまた、リダイレクトgrep -qm1を短縮するために働くことができると思います/dev/null-しかし、GNU grepは奇妙なことw /を-q行い、これら2つがどのように連携するか思い出せません。
wc -lはありませんが、の場合よりも少し安いと思いgrep -c ''ます。
これが一つの方法です。
$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$