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)
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)
使用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)