GNU/Linux >> Linux の 問題 >  >> Linux

1 で始まる行を grep しますが、10、11、100 などではありません。

本文中の質問

1 で始まる行を選択 とスペースが続きます

grep -c '^1\s'          file
grep -c '^1[[:space:]]' file

これにより、行数も表示されます (wc を呼び出す必要はありません)

タイトルの質問

1 しない その後に別の数字が続く (または何もない):

grep -cE '^1([^0-9]|$)' file 

しかし、上記の両方のソリューションには興味深い問題があります。読み続けてください。

質問の本文で、ユーザーはファイルが「タブ区切り」であると主張しています。

区切り文字

タブ

1 で始まる行 その後にタブ (コマンド内の実際のタブ) が続きます。区切り文字がスペース (またはその他、またはなし) の場合、これは失敗します:

grep '^1    ' file

スペース

1 で始まる行 その後にスペース (コマンド内の実際のスペース) が続きます。区切り文字がその他またはなしの場合、これは失敗します。:

grep '^1 ' file

タブまたはスペース

grep '^1(   | )' file
grep '^1[[:blank:]]' file

空白

より柔軟なオプションは、複数のスペース (水平および垂直) 文字を含めることです。 [:space:] 文字クラス セットは で構成されます (スペース)、\t (水平タブ)、\r (キャリッジリターン),\n (改行)、\v (垂直タブ) と \f (用紙送り)。ただし、grep は改行に一致させることはできません (これは -z でのみ回避できる内部制限です) オプション)。デリミタの記述として使用できます。 \s の GNU 利用可能な短縮形を使用することも可能で、より短いです。 :

grep -c '^1[[:space:]]` file
grep -c '^1\s'          file

ただし、区切り文字がコロンのようなものである場合、このオプションは失敗します : またはその他の句読点 (または任意の文字)。

境界

または、数字から「数字ではない」境界への移行を使用できます。実際には「[_[:alnum:]] にない文字」 (_a-zA-Z0-9 )":

grep -c  '^1\b' file       # portable but not POSIX.
grep -c  '^1\>' file       # portable but not POSIX.
grep -wc '^1'   file       # portable but not POSIX.
grep -c  '^1\W' file       # portable but not POSIX (not match only a `1`) (not underscore in BSD).

これは、1 で始まり、句読点が続く有効な行として受け入れます。


これが欲しいだけのようですね:

$ grep '^1\b' a
1        TGCAG.....
1        TGCAG......

このカウント部分について:

$ grep -c '^1\b' file
2

awk で :

awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile

Linux
  1. grepを使用してファイル内のすべてのメールアドレスを一覧表示する

  2. 2つのパターンの間(およびそれを含む)の線を印刷しますか?

  3. 指定された列が大文字で始まる場合に行を印刷しますか?

  1. 「?」で始まる行を無視してファイルを出力する方法は?

  2. rc.local でスクリプトを実行します:スクリプトは機能しますが、起動時には機能しません

  3. Wget で保存せずにファイルを要求するにはどうすればよいですか?

  1. ドットで始まる名前のファイルをコピーするにはどうすればよいですか?

  2. ファイルを行単位で切り詰めるには?

  3. /etc/passwd はグループ内のユーザーを表示しますが、/etc/group は表示しません