我有一个如下所示的.txt文件:
9342432_A1 9342432 1 0 0 0 4392483_A2 4392483 2 0 0 0 4324321_A3 4324321 1 0 0 0 9342432 9342432 2 0 0 0
例如,我想要生成一个ID为4324321_A3和9342432(基于第一列!)的子集。 我尝试了以下命令来查找完全匹配:
grep -E '4324321_A3|9342432'
但是当我使用这一行时,我最终得到了这样一个数据集:
9342432_A1 9342432 1 0 0 0 4324321_A3 4324321 1 0 0 0 9342432 9342432 2 0 0 0
问题是匹配ID(9342432_A1)的一部分的行不应该在那里。 谁能帮我这个?
我想结束这个:
4324321_A3 4324321 1 0 0 0 9342432 9342432 2 0 0 0
它匹配
9342432_A1 9342432 1 0 0 0
因为它在第二列有9342432
。
你需要更新命令,使这些字开始grep检查行,也就是使用^word
:
$ grep -E '^4324321_A3|^9342432' file 4324321_A3 4324321 1 0 0 0 9342432 9342432 2 0 0 0
为了使它更准确,你也可以用-w
来匹配整个单词。 这样grep -wE '^4324321_A3|^9342432' file
就不会像
4324321_A3something 4324321 1 0 0 0
您的正则表达式不检查ID是否在行的开始。 只需在正则表达式的开头添加一个^
,告诉它只在行的开头匹配ID,然后使用()
对替代项进行分组:
grep -E '^(4324321_A3|9342432)\b' <file>
\b
是一个边界字符,强制它只匹配整个单词。
在你的grep ^
开头和后面的格式中包含空格 。
在每个模式的开始处添加一行起始点和一个字边界
grep -E '^4324321_A3\b|^9342432\b'
当需要在文件的特定字段(或列)上进行匹配时,最好使用awk
之类的工具而不是grep
。 你可以写这样的东西:
awk '$1 == "STRING_TO_MATCH"' txtfile.txt
这也可以在不同于第一列的列上使用(第二列为$ 2,第三列为$ 3,依此类推)。
awk接受正则表达式以及grep。
问候。