如果模式存在于另一列中,则从该列中移除模式

Remove pattern from a column if it is present in another one

我有这个文件:

>AX-89916436-Affx-G-[A/G]
TTGTCCGAGAGTGACGTCAATCCGCA
>AX-89916437-Affx-A-[A/G]
TGTGTGGAAACTCCG
>AX-89916438-Affx-C-[A/C]
GAAGTACGGTAACAT
>AX-89916440-Affx-T-[G/T]
AGTTGATGGTGTATGTGTGTCTTT

我想在最后一个字段中删除 [X/X] 第 4 个字段中的字母。要获得类似的东西:

>AX-89916436-Affx-G-A
TTGTCCGAGAGTGACGTCAATCCGCA
>AX-89916437-Affx-A-G
TGTGTGGAAACTCCG
>AX-89916438-Affx-C-A
GAAGTACGGTAACAT
>AX-89916440-Affx-T-G
AGTTGATGGTGTATGTGTGTCTTT

我有:

 awk -F'-' '
    match([=12=], /\[[A-Z]\/[A-Z]]/) {m = substr([=12=], RSTART, RLENGTH); if(/^>/ && $NF~/m/); print ... }'

你可以使用

awk 'BEGIN{FS=OFS="-"} /^>/ &&  ~ /\[[A-Z]\/[A-Z]]/{gsub("[][/""]", "", );}1' file

详情:

  • BEGIN{FS=OFS="-"} - 将 input/output 字段分隔符设置为 -
  • /^>/ && ~ /\[[A-Z]\/[A-Z]]/ - 如果字符串以 > 开头并且字段 5 包含 [ + 大写字母 + / + 大写字母 + ] 子串...
  • {gsub("[][/""]", "", );} - 然后从字段 5 ][/ 和字段 4 中删除字符
  • 1 - 触发默认的 print 操作。

参见 online demo:

#!/bin/bash
s='>AX-89916436-Affx-G-[A/G]
XXXXXXX
>AX-89916437-Affx-A-[A/G]
XXXXXXXXXXX
>AX-89916438-Affx-C-[A/C]
XXXXXXX
>AX-89916440-Affx-T-[G/T]
XXXXXXX'

awk 'BEGIN{FS=OFS="-"} /^>/ &&  ~ /\[[A-Z]\/[A-Z]]/{gsub("[][/""]", "", );}1' <<< "$s"

输出:

>AX-89916436-Affx-G-A
XXXXXXX
>AX-89916437-Affx-A-G
XXXXXXXXXXX
>AX-89916438-Affx-C-A
XXXXXXX
>AX-89916440-Affx-T-G
XXXXXXX
$ awk 'BEGIN{FS=OFS="-"} />/{gsub("[][/]",""); sub($(NF-1),"",$NF)}1' file
>AX-89916436-Affx-G-A
XXXXXXX
>AX-89916437-Affx-A-G
XXXXXXXXXXX
>AX-89916438-Affx-C-A
XXXXXXX
>AX-89916440-Affx-T-G
XXXXXXX

使用您显示的示例,请尝试以下 awk 代码。简单的解释是将 FSOFS 设置为 = 并在主要部分检查一行是否从 > 开始并且第 5 个字段匹配正则表达式 \[[A-Z]\/[A-Z]] 然后删除使用 gsub 在第 5 个字段中出现第 4 个字段的任何值。 1awksh 打印当前 edited/non-edited 行的方式。

awk '
BEGIN{ FS=OFS="-" }
/^>/ &&  ~ /\[[A-Z]\/[A-Z]]/{
  gsub("[][/""]", "", )
}
1' Input_file

这是另一个awk:

awk 'BEGIN {FS=OFS="-"} NF>1 {gsub("[][/" $(NF-1) "]", "", $NF) } 1' file

>AX-89916436-Affx-G-A
XXXXXXX
>AX-89916437-Affx-A-G
XXXXXXXXXXX
>AX-89916438-Affx-C-A
XXXXXXX
>AX-89916440-Affx-T-G
XXXXXXX

使用sed

$ sed -E s'#([A-Z])-\[(|([A-Z]))/(|([A-Z]))]#-#' input_file
>AX-89916436-Affx-G-A
TTGTCCGAGAGTGACGTCAATCCGCA
>AX-89916437-Affx-A-G
TGTGTGGAAACTCCG
>AX-89916438-Affx-C-A
GAAGTACGGTAACAT
>AX-89916440-Affx-T-G
AGTTGATGGTGTATGTGTGTCTTT

现在好多了:

>AX-89916436-Affx-G-A
TTGTCCGAGAGTGACGTCAATCCGCA
>AX-89916437-Affx-A-G
TGTGTGGAAACTCCG
>AX-89916438-Affx-C-A
GAAGTACGGTAACAT
>AX-89916440-Affx-T-G
AGTTGATGGTGTATGTGTGTCTTT

# gawk profile, created Thu May 12 05:05:48 2022

# Rule(s)

8 NF*=($_=(NF=NF)==!_?$!_:$!(NF-=($(_+=(_-=_)-+-++_-+-++_)=\
       $((_+=_+=(_^=_<_)+_)-($--_!=$--_) ) )^(_-=_)+!_))~""'