【问题标题】:Removing text after a certain number of letter and before a specific character在一定数量的字母之后和特定字符之前删除文本
【发布时间】:2021-12-19 11:28:51
【问题描述】:

我有一个如下所示的文件:

xxxxxxx-000-387-159 < 50 null null_27   KCNQ1   1    1.430   0.773  0.656   1.724      
xxxxxxx-000-375-285 < 50 < 50 100 - 500_0   KCNQ1   2    1.409   0.786   0.623   1.801    
xxxxxxx-000-523-531 50 - 100    50 - 100    100 - 500_31    KCNQ1   3    1.326   0.848   0.479   1.557

我需要删除 KCNQ1 中前 19 个字符之后和字母 K 之前的所有内容(空格和字符)。 预期的输出是:

xxxxxxx-000-387-159 KCNQ1   1    1.430   0.773   0.656   1.724
xxxxxxx-000-375-285 KCNQ1   2    1.409   0.786   0.623   1.801
xxxxxxx-000-523-531 KCNQ1   3    1.326   0.848   0.479   1.557

我用 sed 试过了:

sed -e 's/...................KCNQ/ KCNQ/g' file.rpt > file_new.rpt

但是,它只改变了第一行。

我做错了什么?

【问题讨论】:

    标签: linux unix awk sed


    【解决方案1】:

    假设前19个字符和KCNQ之间没有K,你可以使用

    sed -E 's/^(.{19})[^K]*/\1/' file
    # If you need to make sure there is `KCNQ` string on the right:
    sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' file
    

    查看online demo

    #!/bin/bash
    s='xxxxxxx-000-387-159 < 50 null null_27 KCNQ1 1 1.430 0.773 0.656 1.724
    xxxxxxx-000-375-285 < 50 < 50 100 - 500_0 KCNQ1 2 1.409 0.786 0.623 1.801
    xxxxxxx-000-523-531 50 - 100 50 - 100 100 - 500_31 KCNQ1 3 1.326 0.848 0.479 1.557'
    sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' <<< "$s"
    

    输出:

    xxxxxxx-000-387-159 KCNQ1 1 1.430 0.773 0.656 1.724
    xxxxxxx-000-375-285 KCNQ1 2 1.409 0.786 0.623 1.801
    xxxxxxx-000-523-531 KCNQ1 3 1.326 0.848 0.479 1.557
    

    另外,如果字符串中只有一个KCNQ,你也可以使用

    sed -E 's/^(.{19}).*(KCNQ)/\1 \2/' file
    

    其中[^K]* 替换为.*

    【讨论】:

      【解决方案2】:

      awk会很简单,用你展示的示例,请尝试以下代码。

      awk '{print substr($0,1,18),substr($0,index($0,"K"))}'  Input_file
      

      解释: 简单的解释是,在每一行打印子字符串。现在子字符串基于 OP 的要求(从哪个位置到我们需要打印的位置)。首先打印当前行中的第 1 到第 18 个字符,然后获取索引(K 字母的位置值)并从该位置开始打印到此代码中每个当前行的最后一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-29
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 2019-02-02
        相关资源
        最近更新 更多