在 grep 中使用正则表达式提取第一个单词

Extract first word using regex in grep

我有一个大文本文件,其中包含

等模式
*pattern1, 34:38,info=a1,signal=s1
*pattern2, 32:38,info=a1,signal=s1
*pattern2,36:38,info=a1,signal=s1
*pattern_4,38:38,info=a1,signal=s1

我想使用 grep 在第一个逗号之前提取唯一的第一个单词。我尝试使用 grep '^*[A-Za-z]' file.txt | sort --uniqgrep '^*[^,]' file.txt | sort --uniq 但没有得到第一个词。有人可以评论吗?

如果您知道单词是逗号分隔的,只需从每行的开头搜索逗号以外的任何内容。

使用-o只打印每行匹配的部分。 grep通常用于过滤,不用于提取,但有时可以使用此选项。

grep -o '^[^,]*' file.txt | sort -u

要获取第一个单词并使其独一无二,您可以使用此 awk:

awk -F, '!uniq[]++ {print }' file

*pattern1
*pattern2
*pattern_4

仅当在数组 uniq 中找不到 </code> 时,条件 <code>!uniq[]++ 才会 return 为真。一旦我们在这个数组中添加一个元素,我们就会将它的值增加到 1 从而导致 !uniq[]++ 到 return false.

{print } 只会在 true 情况下执行。

使用您展示的示例和 GNU awk 使用 gensub 您可以尝试以下操作。这将在整个 Input_file.

的第一列中提供唯一值
awk '!seen[[=10=]=gensub(/,.*/,"\1","1")]++' Input_file

解释: 简单的解释是,使用 gensub 我们得到第一个逗号之前的所有内容,然后在数组中我们正在根据要求否定每行中的重复项。

I tried using grep '^*[A-Za-z]' file.txt | sort --uniq

grep 默认显示它匹配的整行。如果您希望 grep 仅显示匹配的内容,请使用 -o 选项。

grep '^[^,]*' -o file.txt | sort -u

[^,] 表示“任何不是逗号的东西。