【问题标题】:Extract first word using regex in grep在 grep 中使用正则表达式提取第一个单词
【发布时间】:2021-09-11 18:01:30
【问题描述】:

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

之类的模式
*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,但没有得到第一个单词。有人可以评论吗?

【问题讨论】:

  • 你能用awk吗:awk -F"," '{print $1}' file.txt
  • 请将该示例输入的所需输出(无描述、无图像、无链接)添加到您的问题(无评论)。

标签: regex linux shell grep


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    awk -F, '!uniq[$1]++ {print $1}' file
    
    *pattern1
    *pattern2
    *pattern_4
    

    条件!uniq[$1]++ 仅当在数组uniq 中找不到$1 时才会返回true。一旦我们在这个数组中添加一个元素,我们就会将它的值增加到 1 从而导致 !uniq[$1]++ 返回 false。

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

    【讨论】:

      【解决方案3】:

      使用您展示的示例和使用gensub 的GNU awk,您可以尝试关注。这将在整个 Input_file 的第一列中提供唯一值。

      awk '!seen[$0=gensub(/,.*/,"\\1","1")]++' Input_file
      

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

      【讨论】:

      • 对大文件可能不太有效(与 anubhava 的解决方案相比;虽然未经测试),但作为正常使用的替代方案很方便。
      【解决方案4】:

      我尝试使用grep '^*[A-Za-z]' file.txt | sort --uniq

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

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

      [^,] 的意思是“任何不是逗号的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多