4

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

5 回答 5

8

它匹配

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
于 2013-06-14T13:58:19.563 回答
4

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

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

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

问候。

于 2013-06-14T14:05:46.950 回答
3

您的正则表达式不会检查 ID 是否位于行首。只需^在正则表达式的开头包含 a 以告诉它仅匹配行开头的 ID,然后使用 对备选方案进行分组()

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

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

于 2013-06-14T14:02:24.340 回答
1

在您的 grep 中包含^开头和模式之后的空格

于 2013-06-14T13:57:55.533 回答
1

在每个模式的开头添加一个行首锚点和一个单词边界

grep -E '^4324321_A3\b|^9342432\b'
于 2013-06-14T13:59:41.153 回答