bash 文件子字符串 add/replace 仅在匹配中放置
bash file substring add/replace inplace in matches only
我有一个包含不同条目的 VCF file,我需要根据多个匹配项替换(或添加,如果不存在)一个子字符串。例如
head file
### OUTPUT:
1 47746672 . A G . . pz_name=GHARTxI16uuT15921;qual=2201;
1 47746672 . C G . . pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . pz_name=GHARFSGSI17uuC19091;qual=816;
# ...
我需要查看一些条件,以便为变异患者的每个组合(两者都可以重复,但它们的组合是唯一的)仅分离特定的线,例如以第 4 行为例:
- 那个
== "47746675" && == "C" && == "G"
- 和
pz_name=GHARTxI16uuT15921
在这一行中我需要:
- 如果不存在,请添加
status=something;
- 将
status=<something-else>
替换为 status=something
(如果存在)
如何在 bash 中使用某种就地替换来完成这一切?可能吗?非常感谢替代性能有效方法的建议!
非常感谢您的帮助!
这就是你想要做的吗?
$ awk '{print [=10=] (/pz_name=GHARFSGSI17uuC19091/ && !/status=/ ? "status=something;" : "")}' file
1 47746675 . C G . . ad_alt=73;ad_ref=65;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5252;pz_name=GHARMALFI17uuM11471;qual=2201;
1 47746675 . C G . . ad_alt=65;ad_ref=57;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5242;pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . ad_alt=53;ad_ref=38;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5824;pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . ad_alt=48;ad_ref=49;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.4948;pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . ad_alt=29;ad_ref=39;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.4265;pz_name=GHARFSGSI17uuC19091;qual=816;status=something;
如果您想要 "inplace" 编辑,那么使用 GNU awk 使用 awk -i inplace '...' file
,或者使用任何 awk 使用 awk '...' file > tmp && mv tmp file
.
更新:鉴于您更新的问题:
$ awk ' == "47746675" && == "C" && == "G" && /pz_name=GHARFSGSI17uuC19091/{ sub(/(status=.*)?$/,"status=something;")} 1' file} 1' file
### OUTPUT:
1 47746672 . A G . . pz_name=GHARTxI16uuT15921;qual=2201;
1 47746672 . C G . . pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . pz_name=GHARFSGSI17uuC19091;qual=816;status=something;
# ...
我有一个包含不同条目的 VCF file,我需要根据多个匹配项替换(或添加,如果不存在)一个子字符串。例如
head file
### OUTPUT:
1 47746672 . A G . . pz_name=GHARTxI16uuT15921;qual=2201;
1 47746672 . C G . . pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . pz_name=GHARFSGSI17uuC19091;qual=816;
# ...
我需要查看一些条件,以便为变异患者的每个组合(两者都可以重复,但它们的组合是唯一的)仅分离特定的线,例如以第 4 行为例:
- 那个
== "47746675" && == "C" && == "G"
- 和
pz_name=GHARTxI16uuT15921
在这一行中我需要:
- 如果不存在,请添加
status=something;
- 将
status=<something-else>
替换为status=something
(如果存在)
如何在 bash 中使用某种就地替换来完成这一切?可能吗?非常感谢替代性能有效方法的建议!
非常感谢您的帮助!
这就是你想要做的吗?
$ awk '{print [=10=] (/pz_name=GHARFSGSI17uuC19091/ && !/status=/ ? "status=something;" : "")}' file
1 47746675 . C G . . ad_alt=73;ad_ref=65;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5252;pz_name=GHARMALFI17uuM11471;qual=2201;
1 47746675 . C G . . ad_alt=65;ad_ref=57;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5242;pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . ad_alt=53;ad_ref=38;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.5824;pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . ad_alt=48;ad_ref=49;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.4948;pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . ad_alt=29;ad_ref=39;denovo=NA;dp_bin=50;father_dp_bin=NA;father_gt=NA;filter=PASS;gene_name_correct=STIL;gq=99;gt=het;mother_dp_bin=NA;mother_gt=NA;perc_alt=0.4265;pz_name=GHARFSGSI17uuC19091;qual=816;status=something;
如果您想要 "inplace" 编辑,那么使用 GNU awk 使用 awk -i inplace '...' file
,或者使用任何 awk 使用 awk '...' file > tmp && mv tmp file
.
更新:鉴于您更新的问题:
$ awk ' == "47746675" && == "C" && == "G" && /pz_name=GHARFSGSI17uuC19091/{ sub(/(status=.*)?$/,"status=something;")} 1' file} 1' file
### OUTPUT:
1 47746672 . A G . . pz_name=GHARTxI16uuT15921;qual=2201;
1 47746672 . C G . . pz_name=GHARMALFI17uuM12201;qual=1932;status=RE;
1 47746675 . C G . . pz_name=GHARIGANI17uuA10531;qual=1541;
1 47746675 . C G . . pz_name=GHARTxI16uuT15921;qual=1440;status=AC;
1 47746675 . C G . . pz_name=GHARFSGSI17uuC19091;qual=816;status=something;
# ...