bash:基于第一列的grep完全匹配

我有一个如下所示的.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。

问候。