我有一个.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
答案 0 :(得分:7)
匹配
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
答案 1 :(得分:3)
如果您需要匹配文件的特定字段(或列),最好使用awk
而不是grep
之类的工具。你可以这样写:
awk '$1 == "STRING_TO_MATCH"' txtfile.txt
这也适用于与第一列不同的列(第二列使用$ 2,第三列使用$ 3,依此类推)。
awk接受正则表达式以及grep。
问候。
答案 2 :(得分:2)
您的正则表达式不会检查ID是否在行的开头。只需在正则表达式的开头添加^
,告诉它只匹配行开头的ID,然后使用()
对备选项进行分组:
grep -E '^(4324321_A3|9342432)\b' <file>
\b
是一个边界字符,强制它只匹配整个单词。
答案 3 :(得分:1)
在你的grep中包含^
开头的以及格式后的空格{{1}}。
答案 4 :(得分:1)
在开头添加一个行开始,在每个模式的末尾添加一个单词边界
grep -E '^4324321_A3\b|^9342432\b'