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
    是内联编辑器
  • 使用命令
    s/
    运行sed将进行搜索和替换。语法是斜杠分隔的:
    s/search\u patter/replace\u pattern
  • 搜索模式是
    \([A-Ba-b0-9\]*\)\([0-9]*\)\(.*\)
    。它将线路分为3部分:
    • 1)
      \([A-Ba-b0-9\]*\)
      由字母、数字或_
    • 2) …后跟
      \u编号
      (匹配
      \([0-9]*\)
    • 3) 行的其余部分(匹配
      \(.*)
  • \1\3
    将仅用第1部分和第3部分替换字符串,从而删除第2部分
试试看

这是怎么回事

  • sed
    是内联编辑器
  • 使用命令
    s/
    运行sed将进行搜索和替换。语法是斜杠分隔的:
    s/search\u patter/replace\u pattern
  • 搜索模式是
    \([A-Ba-b0-9\]*\)\([0-9]*\)\(.*\)
    。它将线路分为3部分:
    • 1)
      \([A-Ba-b0-9\]*\)
      由字母、数字或_
    • 2) …后跟
      \u编号
      (匹配
      \([0-9]*\)
    • 3) 行的其余部分(匹配
      \(.*)
  • \1\3
    将仅用第1部分和第3部分替换字符串,从而删除第2部分

您可以尝试使用此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

您可以尝试使用此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。