Awk 删除选项卡文件中的模式

Awk 删除选项卡文件中的模式,awk,sed,Awk,Sed,在此处输入代码大家好 我有一个数据框,例如: 我有一个文件,例如: scaffold_1_1 X 2 2 scaffold_24_0 X 9 2 scaffold_15 X 2 2 IDBA_scaffold_30_1 X 2 317 scf7180005161000_2 X 1 2 这个想法就是简单地删除第一个名字中所有名字的最后一个数字部分 但有三种类型的脚手架名称: scaffold_number0_number1 scaffold_

在此处输入代码
大家好 我有一个数据框,例如:

我有一个文件,例如:

scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scf7180005161000_2  X   1   2
这个想法就是简单地删除第一个名字中所有名字的最后一个数字部分 但有三种类型的脚手架名称:

scaffold_number0_number1
scaffold_number0
IDBA_scaffold_number0_number1
scfXXX_number1
这个想法是去掉所有的数字,这里是我在这个例子中应该得到的结果:

scaffold_1  X   2   2
scaffold_24 X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30    X   2   317
scf7180005161000    X   1   2
你有办法解决这个问题吗

谢谢您的帮助。

第一种解决方案:请尝试以下内容。(如果有人只是想替换最后一个
\u
和下面的数字,那么只有下面的内容可能会有所帮助。)

awk '{sub(/_[0-9]+$/,"",$1)} 1'  Input_file
第二种解决方案:

如果您想检查从字符串
sacfold
开始的第一个字段中的值是否超过2个,请尝试以下操作

awk '(/scaffold/ && num=split($1,a,"_")>2) || /scf/{sub(/_[0-9]+$/,"",$1)} 1' Input_file
输出如下

scaffold_1 X 2 2
scaffold_24 X 9 2
scaffold_15 X   2   2
IDBA_scaffold_30 X 2 317
scf7180005161000 X 1 2
第一种解决方案:请尝试以下内容。(如果有人只是想替换最后一个
\uu
和后面的数字,那么只有以下内容可能会有所帮助。)

awk '{sub(/_[0-9]+$/,"",$1)} 1'  Input_file
第二种解决方案:

如果您想检查从字符串
sacfold
开始的第一个字段中的值是否超过2个,请尝试以下操作

awk '(/scaffold/ && num=split($1,a,"_")>2) || /scf/{sub(/_[0-9]+$/,"",$1)} 1' Input_file
输出如下

scaffold_1 X 2 2
scaffold_24 X 9 2
scaffold_15 X   2   2
IDBA_scaffold_30 X 2 317
scf7180005161000 X 1 2
你可以试试Perl

perl -pe ' s/(^\S+)_\d\b/$1/g ' 
用你的投入

$ cat bean.txt
scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scf7180005161000_2  X   1   2
$ perl -pe ' s/(^\S+)_\d\b/$1/g ' bean.txt
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scf7180005161000  X   1   2
$
感谢@anubhava抓住一个边缘案例并帮助修复它

$ cat bean2.txt
scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scaffold_1_15     X   2   2  # => this was not fixed in first answer
$ perl -pe 's/^(?!scaffold_\d+\b)(\S+)_\d+\b/$1/g' bean2.txt
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scaffold_1     X   2   2
$
你可以试试Perl

perl -pe ' s/(^\S+)_\d\b/$1/g ' 
用你的投入

$ cat bean.txt
scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scf7180005161000_2  X   1   2
$ perl -pe ' s/(^\S+)_\d\b/$1/g ' bean.txt
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scf7180005161000  X   1   2
$
感谢@anubhava抓住一个边缘案例并帮助修复它

$ cat bean2.txt
scaffold_1_1    X   2   2
scaffold_24_0   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30_1  X   2   317
scaffold_1_15     X   2   2  # => this was not fixed in first answer
$ perl -pe 's/^(?!scaffold_\d+\b)(\S+)_\d+\b/$1/g' bean2.txt
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scaffold_1     X   2   2
$

下面是另一个
awk
变体:

awk 'BEGIN{FS=OFS="\t"} $1 ~ /^scf[0-9]+_[0-9]+$/ || split($1, a, "_") > 2 {
sub(/_[0-9]+$/, "", $1) } 1' file


下面是另一个
awk
变体:

awk 'BEGIN{FS=OFS="\t"} $1 ~ /^scf[0-9]+_[0-9]+$/ || split($1, a, "_") > 2 {
sub(/_[0-9]+$/, "", $1) } 1' file


使用支持ERE的
-E
的任何sed,例如GNU或OSX/BSD sed:

$ sed -E 's/((_|scf)[0-9]+)_[0-9]+/\1/' file
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scf7180005161000  X   1   2

使用支持ERE的
-E
的任何sed,例如GNU或OSX/BSD sed:

$ sed -E 's/((_|scf)[0-9]+)_[0-9]+/\1/' file
scaffold_1    X   2   2
scaffold_24   X   9   2
scaffold_15 X   2   2
IDBA_scaffold_30  X   2   317
scf7180005161000  X   1   2


感谢您的帮助,但正如您所看到的,_15部分已被删除,因此必须保留该部分。@bean,请尝试我的第二个解决方案,然后让我知道?现在SCF780005161000之后仍然有_2请现在检查我的第二个解决方案。该解决方案已编辑,请让我知道。感谢您的帮助,但正如您所看到的,_15部分已被删除一段时间这一个必须保留它。@bean,请尝试我的第二个解决方案,然后让我知道?现在SCF780005161000之后仍然有2请现在检查我的第二个解决方案。它已编辑,请让我知道。很酷,几乎我的第二个解决方案或唯一条件我已将结果拆分为一个变量并检查它,很高兴知道没有v我们可以检查一下它的数量++ve@RavinderSingh13:谢谢,++谢谢你的解决方案。我想OP希望输出中有
SCF780005161000
而不是
SCF780005161000\u 2
很酷,几乎是我的第二个解决方案或唯一的条件。我将split的结果保留为一个变量并检查它,很高兴知道没有变量我们可以检查数一数++ve@RavinderSingh13:谢谢,++谢谢你的解决方案。我想OP想要输出
scf7180005161000
,而不是
scf7180005161000\u 2
@anubhava先生,你说得对..我刚试过
perl-pe的/(^.+)(\d+)\u\d+\b/$2?“$1$2”:$&/ge'
,请查看..如果可以,我将添加可能适用于OP数据的答案,但新的正则表达式可能容易出错。我认为最好使用负前瞻,例如
perl-pe的/^(?!scaffold\d+\b)(\s+)_\d+\b/$1/g'文件
@anubhava先生,我需要您帮助查看我的正则表达式解决方案,请在您获得time@anubhava先生,你说得对..我刚刚试过
perl-pe的/(^.+?)(\ud+)\ud+\b/$2?“$1$2”:$&/ge'
,请查看..如果可以,我将添加到可能适用于OP数据的答案中,但新的正则表达式可能容易出错。我认为最好使用负前瞻性,例如
perl-pe's/^(?!scaffold\d+\b)(\s+\d+\b/$1/g”文件
@anubhava先生,我需要您帮助查看我的正则表达式解决方案,请您在有时间时查看