libFooInternal
大家好
我有一个数据框,例如:
我有一个文件,例如:
enter code here
这个想法只是删除名字中所有名字的最后一个数字部分 但是scaffolds_names有3种类型:
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
并且想法是删除所有数字_1,这是我在此示例中应该得到的结果:
scaffold_number0_number1
scaffold_number0
IDBA_scaffold_number0_number1
scfXXX_number1
您有解决的办法吗?
感谢您的帮助。
答案 0 :(得分:2)
第一个解决方案: :请问您能尝试以下操作吗(以防万一有人只是想替换最后的_
和后面的数字,那么仅跟随可能会有所帮助。 / p>
awk '{sub(/_[0-9]+$/,"",$1)} 1' Input_file
第二个解决方案:
如果要检查从字符串_
开始的第一个字段中是否应该有2个以上的sacffold
值,然后尝试执行以下操作。
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
答案 1 :(得分:1)
您可以尝试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
$
答案 2 :(得分:1)
这是另一个awk
变体:
awk 'BEGIN{FS=OFS="\t"} $1 ~ /^scf[0-9]+_[0-9]+$/ || split($1, a, "_") > 2 {
sub(/_[0-9]+$/, "", $1) } 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
答案 3 :(得分:0)
使用任何支持-E
的sed进行ERE,例如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