如果模式存在于另一列中,则从该列中移除模式
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
代码。简单的解释是将 FS
和 OFS
设置为 =
并在主要部分检查一行是否从 >
开始并且第 5 个字段匹配正则表达式 \[[A-Z]\/[A-Z]]
然后删除使用 gsub
在第 5 个字段中出现第 4 个字段的任何值。 1
是 awk
sh 打印当前 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-=($(_+=(_-=_)-+-++_-+-++_)=\
$((_+=_+=(_^=_<_)+_)-($--_!=$--_) ) )^(_-=_)+!_))~""'
我有这个文件:
>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
代码。简单的解释是将 FS
和 OFS
设置为 =
并在主要部分检查一行是否从 >
开始并且第 5 个字段匹配正则表达式 \[[A-Z]\/[A-Z]]
然后删除使用 gsub
在第 5 个字段中出现第 4 个字段的任何值。 1
是 awk
sh 打印当前 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-=($(_+=(_-=_)-+-++_-+-++_)=\
$((_+=_+=(_^=_<_)+_)-($--_!=$--_) ) )^(_-=_)+!_))~""'