Grep 行以 1 开头,但不是 10、11、100 等

mah*_*mah 11 linux grep numeric-data

我有一个带有标签计数的基因组数据文件,我想知道一次代表了多少:

$ grep "^1" file |wc -l
Run Code Online (Sandbox Code Playgroud)

包括所有以 1 开头的行,因此它包括表示 10 次、11 次、100 次、1245 次等的标签。我该怎么做?

Current format
79      TGCAG.....
1       TGCAG.....
1257    TGCAG.....
1       TGCAG......
Run Code Online (Sandbox Code Playgroud)

我只想要以下几行:

1       TGCAG.....
Run Code Online (Sandbox Code Playgroud)

所以它不能包含以 1257 开头的行。注意:上面的文件是制表符分隔的。

ImH*_*ere 27

身体里的问题

选择以 a 开头1且后跟一个空格的行

grep -c '^1\s'          file
grep -c '^1[[:space:]]' file
Run Code Online (Sandbox Code Playgroud)

这也将给出行数(不需要调用 wc)

标题中的问题

A后面1 没有另一个数字(或什么都没有):

grep -cE '^1([^0-9]|$)' file 
Run Code Online (Sandbox Code Playgroud)

但是上述两种解决方案都有一些有趣的问题,请继续阅读。


在问题的正文中,用户声称该文件是“制表符分隔的”。

分隔符

标签

以 a1开头的行后跟一个制表符(命令中的实际制表符)。如果分隔符是空格(或任何其他,或没有),则失败:

grep '^1    ' file
Run Code Online (Sandbox Code Playgroud)

空间

以 a1开头的行后跟一个空格(命令中的实际空格)。如果分隔符是任何其他或没有,这将失败。:

grep '^1 ' file
Run Code Online (Sandbox Code Playgroud)

制表符或空格

grep '^1(   | )' file
grep '^1[[:blank:]]' file
Run Code Online (Sandbox Code Playgroud)

空白

更灵活的选择是包含多个空格(水平和垂直)字符。的[:space:]字符类集是由(空间), \t(水平制表), \r(回车), \n(换行), \v(垂直制表符)和\f(形式进料)。但是 grep 不能匹配换行符(这是一个内部限制,只能通过-z选项来避免)。可以将其用作分隔符的描述。也可以使用 GNU 可用的速记\s

grep -c '^1[[:space:]]` file
grep -c '^1\s'          file
Run Code Online (Sandbox Code Playgroud)

但是,如果分隔符类似于冒号:或任何其他标点符号(或任何字母),则此选项将失败。

边界

或者,我们可以使用从数字到“非数字”边界的转换,实际上是“不在[_[: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).
Run Code Online (Sandbox Code Playgroud)

这将接受以 1 开头并后跟一些标点符号的有效行。


slm*_*slm 19

听起来你只想要这个:

$ grep '^1\b' a
1        TGCAG.....
1        TGCAG......
Run Code Online (Sandbox Code Playgroud)

对于此的计数部分:

$ grep -c '^1\b' file
2
Run Code Online (Sandbox Code Playgroud)


Dop*_*oti 16

awk

awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile
Run Code Online (Sandbox Code Playgroud)

  • Plus 可以使用 `awk '{print $1}' <inputfile|sort -n|uniq -c` 获取标签计数频率的摘要。 (3认同)

roa*_*ima 14

这些中的任何一个都将挑选出1第一列中带有 a的行

awk '$1 == 1'
grep -w '^1'
Run Code Online (Sandbox Code Playgroud)

这些都可以扩展,所以你甚至不需要wc计算行数

awk '$1==1 { x++ } END { print x }'
grep -cw '^1'
Run Code Online (Sandbox Code Playgroud)


jes*_*e_b 5

使用grep

grep -c '^1\s' file
Run Code Online (Sandbox Code Playgroud)

这将匹配任何以 1 开头的行,后跟空格,并提供这些行的计数(消除对 的需要wc -l


$ cat input
79       TGCAG.....
1        TGCAG.....
1257     TGCAG.....
1        TGCAG......
$ grep -Ec '^1\s' input
2
Run Code Online (Sandbox Code Playgroud)