区切り記号

区切り記号

タグの数を含むゲノムデータファイルがありますが、一度に何個表示されるかを知りたいです。

$ grep "^1" file |wc -l

1で始まるすべての行が含まれているため、10、11、100、1245などのラベルが含まれています。どうすればいいですか?

Current format
79      TGCAG.....
1       TGCAG.....
1257    TGCAG.....
1       TGCAG......

私はただ次の行が欲しい:

1       TGCAG.....

したがって、1257 で始まる行を含めることはできません。メモ:上記のファイルはタブで区切られています。

答え1

体の中の質問

1aで始まり、スペースが続く行を選択します。

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

これは行数も提供します(wcを呼び出す必要はありません)。

タイトルに質問

1 いいえ次は他の数字(または何もありません)が続きます。

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

しかし、上記の2つの回避策にはいくつかの興味深い問題があるので、読んでください。


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

区切り記号

商標

1aで始まり、その後にタブ文字(コマンドの実際のタブ文字)が続く行です。区切り文字が空白(または別の区切り文字または区切り文字がない場合)の場合、この操作は失敗します。

grep '^1    ' file

スペース

1aで始まり、その後にスペース(コマンドの実際のスペース)が続く行です。区切り記号が別の区切り記号または区切り文字がない場合、この操作は失敗します。

grep '^1 ' file

タブまたはスペース

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

スペース

より柔軟なオプションは、複数のスペース(水平および垂直)文字を含めることです。文字クラスセットは、(スペース)、(水平タブ)、(キャリッジリターン)、(改行)、(垂直タブ)、(フォームフィード)で構成されています[:space:]。ただし、grepは改行文字と一致することはできません(これは内部制限であり、このオプションを介してのみ回避できます)。これは区切り文字の説明として使用できます。短い GNU 対応の省略形を使用することもできます。\t\r\n\v\f-z\s

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から始まり、その後に句読点が続く有効な行が許可されます。

答え2

あなたが望むものは次のとおりです。

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

計算部分の場合:

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

答え3

そしてawk

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

答え4

使用grep:

grep -c '^1\s' file

これは1で始まり、後にスペースが続くすべての行と一致し、その行の数を提供します(不要wc -l)。


$ cat input
79       TGCAG.....
1        TGCAG.....
1257     TGCAG.....
1        TGCAG......
$ grep -Ec '^1\s' input
2

関連情報