通过使用 awk、sed 或 perl 在指定列中给出范围来移除或删除特定字符

To remove or delete particular character by giving their range in a specified column using awk, sed or perl

我只需要从第 1 列“_p1.pdb_________________”中删除特定字符(例如:从第 3 列的中间指定范围,如 5 到 10 个章程)。我试过这个命令 sed 's/_p.*//' test 但它会删除所有从 _p 开始的东西。我必须删除 38690797 行。那么任何人都可以给出有效的命令来做到这一点吗?

我已经检查了之前所有的问题,没有一个能完全满足我的要求。

示例输入文件:

    EAZ51036_p1.pdb_________________ SSPP00000432782.1_1_p1.pdb______ 0.834183 0.812304    11175    11476     9322
    BBX51096_p1.pdb_________________ EEEP00000435284.1_1_p1.pdb______ 0.834183 0.812304    11175    11476     9322
    CCZ58032_5j3b_p3.pdb____________ NNNP00000343764.6_192_p1.pdb____ NULL____ NULL____ ________ ________ ________
    WWW25032_5j3b_p6.pdb____________ GGGP00000343764.6_192_p2.pdb____ 0.866667 0.070452     7750      630      546
    EEX51032_5j3b_p3.pdb____________ FFFP00000343764.6_192_p3.pdb____ NULL____ NULL____ ________ ________ ________
    EEX51032_p9.pdb_________________ RRRP00000436941.1_1_p1.pdb______ 0.807338 0.807338    11175    11175     9022

期望的输出:

    EAZ51036 SSPP00000432782.1_1_p1.pdb______ 0.834183 0.812304    11175    11476     9322
    BBX51096 EEEP00000435284.1_1_p1.pdb______ 0.834183 0.812304    11175    11476     9322
    CCZ58032 NNNP00000343764.6_192_p1.pdb____ NULL____ NULL____ ________ ________ ________
    WWW25032 GGGP00000343764.6_192_p2.pdb____ 0.866667 0.070452     7750      630      546
    EEX51032 FFFP00000343764.6_192_p3.pdb____ NULL____ NULL____ ________ ________ ________
    EEX51032 RRRP00000436941.1_1_p1.pdb______ 0.807338 0.807338    11175    11175     9022

尝试跟随 awk 一次。

awk '{sub(/_.*_/,"",)} 1'  Input_file

说明: 我在这里使用名为 sub 的开箱即用的函数进行替换。它适用于 sub(regex_which_we_want_to_change_in_lines,new regex/variable,variable/line)。所以在这里我在 </code>(第一个字段)<code>, 中给出 _.*_ 表示从 _.*(涵盖所有内容直到 _ 为 NULL。然后提到 1 表示, awkcondition then action 的方法上工作,所以在这里我将条件设置为 TRUE 并且不提及任何操作,因此默认情况下会发生打印操作,这将打印当前(edited/non-edited)行Input_file.

使用 sed:

sed 's/_[^ ]*//' file