【问题标题】:Remove patterns in a tab file删除选项卡文件中的模式
【发布时间】:2019-02-12 14:30:16
【问题描述】:

enter code here大家好 我有一个数据框,例如:

我有一个文件,例如:

scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scf7180005161000_2  X   1   2

这个想法只是删除第一个中所有名称的最后一个数字部分 但是有 3 种scaffolds_names:

scaffold_number0_number1
scaffold_number0
IDBA_scaffold_number0_number1
scfXXX_number1

这个想法是删除所有的number_1,这是我在这个例子中应该得到的结果:

scaffold_1  X   2   2
scaffold_24 X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30    X   2   317
scf7180005161000    X   1   2

你有解决这个问题的想法吗?

感谢您的帮助。

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    第一个解决方案:您能否尝试关注。(如果有人只想替换最后一个 _ 和后面的数字,那么只有关注可能会有所帮助。

    awk '{sub(/_[0-9]+$/,"",$1)} 1'  Input_file
    

    第二个解决方案:

    如果您想检查从字符串 sacffold 开始的第一个字段中是否应该有超过 2 个 _ 值,请尝试以下操作。

    awk '(/scaffold/ && num=split($1,a,"_")>2) || /scf/{sub(/_[0-9]+$/,"",$1)} 1' Input_file
    

    输出如下。

    scaffold_1 X 2 2
    scaffold_24 X 9 2
    scaffold_15 X   2   2
    IDBA_scaffold_30 X 2 317
    scf7180005161000 X 1 2
    

    【讨论】:

    • 感谢您的帮助,但正如您所见,_15 部分已被删除,必须为这个部分保留..
    • @bean,请尝试我的第二个解决方案,然后告诉我?
    • 现在scf7180005161000_2后面还有_2
    • 现在请检查我的第二个解决方案。已编辑,到时通知我。
    【解决方案2】:

    你可以试试 Perl,

    perl -pe ' s/(^\S+)_\d\b/$1/g ' 
    

    您的意见

    $ cat bean.txt
    scaffold_1_1    X   2   2
    scaffold_24_0   X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30_1  X   2   317
    scf7180005161000_2  X   1   2
    $ perl -pe ' s/(^\S+)_\d\b/$1/g ' bean.txt
    scaffold_1    X   2   2
    scaffold_24   X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30  X   2   317
    scf7180005161000  X   1   2
    $
    

    感谢 @anubhava 发现其中一种边缘情况并帮助修复它。

    $ cat bean2.txt
    scaffold_1_1    X   2   2
    scaffold_24_0   X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30_1  X   2   317
    scaffold_1_15     X   2   2  # => this was not fixed in first answer
    $ perl -pe 's/^(?!scaffold_\d+\b)(\S+)_\d+\b/$1/g' bean2.txt
    scaffold_1    X   2   2
    scaffold_24   X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30  X   2   317
    scaffold_1     X   2   2
    $
    

    【讨论】:

    • @anubhava 先生,你是对的.. 我刚试过perl -pe ' s/(^.+?)(_\d+)?_\d+\b/$2?"$1$2":$&/ge ',请查看.. 如果可以,我会添加到答案中
    • 这可能适用于 OP 的数据,但新的正则表达式可能容易出错。我认为最好使用负前瞻,例如perl -pe 's/^(?!scaffold_\d+\b)(\S+)_\d+\b/$1/g' file
    • @anubhava 先生,我需要您的帮助来审核我对stackoverflow.com/questions/54972535/… 的正则表达式解决方案,请在您有时间时审核
    【解决方案3】:

    这是另一个awk 变体:

    awk 'BEGIN{FS=OFS="\t"} $1 ~ /^scf[0-9]+_[0-9]+$/ || split($1, a, "_") > 2 {
    sub(/_[0-9]+$/, "", $1) } 1' file
    

    scaffold_1  X   2   2
    scaffold_24 X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30    X   2   317
    scf7180005161000    X   1   2
    

    【讨论】:

    • @RavinderSingh13:谢谢,++ 您的解决方案。我认为 OP 希望在输出中使用 scf7180005161000 而不是 scf7180005161000_2
    【解决方案4】:

    对 ERE 使用任何支持 -E 的 sed,例如GNU 或 OSX/BSD seds:

    $ sed -E 's/((_|scf)[0-9]+)_[0-9]+/\1/' file
    scaffold_1    X   2   2
    scaffold_24   X   9   2
    scaffold_15 X   2   2
    IDBA_scaffold_30  X   2   317
    scf7180005161000  X   1   2
    

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2011-10-24
      相关资源
      最近更新 更多