【问题标题】:Remove all text before colon删除冒号前的所有文本
【发布时间】:2012-08-31 03:24:49
【问题描述】:

我有一个包含一定行数的文件。每行如下所示:

TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1

我想删除“:”之前的所有字符,以便仅保留作为基因名称的 PKMYT1。 由于我不是正则表达式脚本方面的专家,任何人都可以帮助我使用 Unix(sed 或 awk)或在 R 中执行此操作吗?

【问题讨论】:

    标签: r unix replace sed awk


    【解决方案1】:

    在 R 中有两种方法:

    foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"
    
    # Remove all before and up to ":":
    gsub(".*:","",foo)
    
    # Extract everything behind ":":
    regmatches(foo,gregexpr("(?<=:).*",foo,perl=TRUE))
    

    【讨论】:

    • 另外,如果任何基因名称本身可能包含:,您可以使用gsub("^[^:]*:", "", foo)匹配并替换到第一个 :跨度>
    【解决方案2】:

    gsub()一起使用的简单正则表达式:

    x <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"
    gsub(".*:", "", x)
    "PKMYT1"
    

    请参阅 ?regex?gsub 以获取更多帮助。

    【讨论】:

      【解决方案3】:

      R 中肯定有超过 2 种方式。这是另一种方式。

      unlist(lapply(strsplit(foo, ':', fixed = TRUE), '[', 2))
      

      如果字符串的长度恒定,我想substr 会比这个或正则表达式方法更快。

      【讨论】:

      • 我怀疑这可能是给出的最快的 R 解决方案。 +1
      【解决方案4】:

      使用 sed:

      sed 's/.*://' < your_input_file > output_file
      

      这将用冒号替换任何内容,因此它将删除所有内容,包括每行最后一个冒号 (because * is greedy by default)。

      根据 Josh O'Brien 的评论,如果您只想替换第一个冒号(包括第一个冒号),请执行以下操作:

      sed "s/[^:]*://"
      

      这将匹配任何不是冒号的内容,后跟一个冒号,然后替换为空。

      请注意,对于这两种模式,它们都会在每行的第一个匹配项处停止。如果您想对一行中的每个匹配项进行替换,请在命令末尾添加 'g' (global) 选项。

      另请注意,在 linux(但不是 OSX)上,您可以使用 -i 就地编辑文件,例如:

      sed -i 's/.*://' your_file
      

      【讨论】:

        【解决方案5】:

        你可以像这样使用awk

        awk -F: '{print $2}' /your/file
        

        【讨论】:

          【解决方案6】:

          使用stringr 包中的str_remove 的解决方案:

          str_remove("TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1", ".*:")
          [1] "PKMYT1"
          

          【讨论】:

            【解决方案7】:

            我从@Sacha Epskamp 的最佳回复中错过的一些非常简单的举动是使用 sub 函数,在这种情况下,取“:”之前的所有内容(而不是删除它),所以它非常简单:

            foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"
            
            # 1st, as she did to remove all before and up to ":":
            gsub(".*:","",foo)
            
            # 2nd, to keep everything before and up to ":": 
            gsub(":.*","",foo)
            

            基本上,同样的事情,只是改变子参数内的“:”位置。希望它会有所帮助。

            【讨论】:

              【解决方案8】:

              如果您有 GNU coreutils 可用,请使用 cut

              cut -d: -f2 infile
              

              【讨论】:

                【解决方案9】:

                我正在研究类似的问题。 John 和 Josh O'Brien 的建议起到了作用。我从这个小标题开始:

                library(dplyr)
                my_tibble <- tibble(Col1=c("ABC:Content","BCDE:MoreContent","FG:Conent:with:colons"))
                

                看起来像:

                  | Col1 
                1 | ABC:Content 
                2 | BCDE:MoreContent 
                3 | FG:Content:with:colons
                

                我需要创建这个小标题:

                  | Col1                  | Col2 | Col3 
                1 | ABC:Content           | ABC  | Content 
                2 | BCDE:MoreContent      | BCDE | MoreContent 
                3 | FG:Content:with:colons| FG   | Content:with:colons
                

                并使用此代码(R 版本 3.4.2)这样做。

                my_tibble2 <- mutate(my_tibble
                        ,Col2 = unlist(lapply(strsplit(Col1, ':',fixed = TRUE), '[', 1))
                        ,Col3 = gsub("^[^:]*:", "", Col1))
                

                【讨论】:

                  【解决方案10】:

                  以下是 2 个等效的解决方案:

                  第一个使用 perl 的 -a 自动拆分功能将每一行拆分为使用 : 的字段,填充 F 字段数组,并打印第二个字段 $F[1](从字段 0 开始计数)

                  perl -F: -lane 'print $F[1]' file
                  

                  第二个使用正则表达式将s///^替换为行首,.*:任何以冒号结尾的字符,没有

                  perl -pe 's/^.*://' file
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-07-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-02-16
                    • 2023-01-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多