繁体   English   中英

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

[英]bash: grep exact matches based on the first column

我有一个.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

当您需要匹配文件的特定字段(或列)时,最好使用awk而不是grep类的工具。 你可以写这样的东西:

awk '$1 == "STRING_TO_MATCH"' txtfile.txt

这也适用于与第一列不同的列(第二列使用$ 2,第三列使用$ 3,依此类推)。
awk接受正则表达式以及grep。

问候。

您的正则表达式不会检查ID是否在行的开头。 只需在正则表达式的开头包含一个^ ,告诉它只匹配行开头的ID,然后使用()对备选项进行分组:

grep -E '^(4324321_A3|9342432)\b' <file>

\\b是一个边界字符,强制它只匹配整个单词。

在你的grep中包含^开头和后面的模式空间

在开头添加行开始,在每个模式的末尾添加单词边界

grep -E '^4324321_A3\b|^9342432\b'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM