Bash 删除选项卡文件中的特定图案
我有一个文件,例如:Bash 删除选项卡文件中的特定图案,bash,Bash,我有一个文件,例如: scaffold_10_1 YP_02917613.1 0.722 397 90 1 55021 53805 70 446 1.803E-180 566 scaffold_282_0 YP_004091438.1 0.799 317 102 1 55023 53395 66 442 2.282E-173 546 scaffold_15 YP_009676312.1 0.021 327 14 1 553
scaffold_10_1 YP_02917613.1 0.722 397 90 1 55021 53805 70 446 1.803E-180 566
scaffold_282_0 YP_004091438.1 0.799 317 102 1 55023 53395 66 442 2.282E-173 546
scaffold_15 YP_009676312.1 0.021 327 14 1 55320 52895
IDBA_scaffold_66230_1 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
scf7180005161552_2 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
我们的想法是删除第一列中所有名称的最后一个数字部分,然后得到:
scaffold_10 YP_02917613.1 0.722 397 90 1 55021 53805 70 446 1.803E-180 566
scaffold_282 YP_004091438.1 0.799 317 102 1 55023 53395 66 442 2.282E-173 546
scaffold_15 YP_009676312.1 0.021 327 14 1 55320 52895
IDBA_scaffold_66230 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
scf7180005161552 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
正如您所看到的,有时在第一个\u编号
之后没有\u编号
scaffold_15
你有办法解决这个问题吗
谢谢你的帮助
对于布鲁诺里:
这是我得到的那张桌子:
scaffold_10 YP_02917613.1 0.722 397 90 1 55021 53805 70 446 1.803E-180 566
scaffold_282 YP_004091438.1 0.799 317 102 1 55023 53395 66 442 2.282E-173 546
scaffold YP_009676312.1 0.021 327 14 1 55320 52895
IDBAscaffold_66230_1 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
scf7180005161552 YP_004091438.1 0.789 317 122 1 55023 53395 66 442 2.282E-173 506
如您所见,脚手架的15已被移除,但我想保留它 试试看
cat file.csv | sed -e 's/\([A-Ba-b0-9_]*\)\(_[0-9]*\)\(.*\)/\1\3/' > file-without-number.csv
这是怎么回事
是内联编辑器sed
- 使用命令
运行sed将进行搜索和替换。语法是斜杠分隔的:s/
s/search\u patter/replace\u pattern
- 搜索模式是
。它将线路分为3部分:\([A-Ba-b0-9\]*\)\([0-9]*\)\(.*\)
- 1)
由字母、数字或_\([A-Ba-b0-9\]*\)
- 2) …后跟
(匹配\u编号
)\([0-9]*\)
- 3) 行的其余部分(匹配
)\(.*)
- 1)
将仅用第1部分和第3部分替换字符串,从而删除第2部分\1\3
是内联编辑器sed
- 使用命令
运行sed将进行搜索和替换。语法是斜杠分隔的:s/
s/search\u patter/replace\u pattern
- 搜索模式是
。它将线路分为3部分:\([A-Ba-b0-9\]*\)\([0-9]*\)\(.*\)
- 1)
由字母、数字或_\([A-Ba-b0-9\]*\)
- 2) …后跟
(匹配\u编号
)\([0-9]*\)
- 3) 行的其余部分(匹配
)\(.*)
- 1)
将仅用第1部分和第3部分替换字符串,从而删除第2部分\1\3
sed 's/\(^[^_]*_[^_]*\)\(_[0-9]\{1,\}\)\([[:blank:]]\{1,\}.*\)/\1\3/' infile
使用IDBA_scaffold_66230_1等数据,您可以尝试以下awk:
awk 'BEGIN{FS=OFS="\t"}$1~/.*_[0-9]+_[0-9]+$/{sub(/_[0-9]+$/,"",$1)}1' infile
您可以尝试使用此sed:
sed 's/\(^[^_]*_[^_]*\)\(_[0-9]\{1,\}\)\([[:blank:]]\{1,\}.*\)/\1\3/' infile
使用IDBA_scaffold_66230_1等数据,您可以尝试以下awk:
awk 'BEGIN{FS=OFS="\t"}$1~/.*_[0-9]+_[0-9]+$/{sub(/_[0-9]+$/,"",$1)}1' infile
你想对每一行还是每一个文件的第一行都这样做?对于文件中的每一行,你想对每一行还是每一个文件的第一行这样做?对于文件中的每一行,它适用于所有类型的脚手架名称,但不适用于SCF780005161552_2_2。哦,还有IDBACAffold_66230_1IDBAscaffold_66230和scaffold_15不应在scaffold中更改。请尝试我的新版本。我在第一篇文章中给出了输出,以解释问题所在。它仍然删除
scaffold_15
部分,并且不删除IDBAscaffold_66230_1
部分……它适用于所有类型的脚手架名称,但不适用于SCF780005161552_2一个。哦,还有IDBACAFFOLD_66230_1应该是IDBACAFFOLD_66230,脚手架不应该在脚手架中更改。请尝试我的新版本。我在第一篇文章中给出了输出,以解释出现了什么问题。它仍然会删除脚手架_15
部分,并且不会删除IDBACAffold_66230_1
part…感谢您的帮助,但它不适用于IDBACAffold_66230_1
和SCF780005161552_2
例如..我用SCF780005161552获得SCF780005161552_2。你想要什么?就像您使用IDBA_scaffold_66230_1更改数据一样,使用sed更为困难。您可以在我的更新答案中尝试使用awk。谢谢您的帮助,但它不适用于IDBA_scaffold_66230_1
和SCF780005161552_2
例如..我使用SCF780005161552获得SCF780005161552_2。你想要什么?就像您使用IDBA_scaffold_66230_1更改数据一样,使用sed更为困难。您可以在我的更新答案中尝试使用awk。