Удалить шаблоны в файле вкладки - PullRequest
0 голосов
/ 12 февраля 2019

enter code here Привет всем У меня есть фрейм данных, такой как:

У меня есть файл, такой как:

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

И идея состоит в том, чтобы просто удалить последнюю часть числавсе имена в первом, но есть 3 типа scaffolds_names:

scaffold_number0_number1
scaffold_number0
IDBA_scaffold_number0_number1
scfXXX_number1

, и идея состоит в том, чтобы удалить все число_1, вот результат, который я должен получить в этом примере:

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

У вас есть идея с этим справиться?

Спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

Использование любого sed, который поддерживает -E для ERE, например, GNU или OSX / BSD seds:

$ 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
0 голосов
/ 12 февраля 2019

Вы можете попробовать 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
$
0 голосов
/ 12 февраля 2019

Вот еще один 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
0 голосов
/ 12 февраля 2019

1-е решение: Не могли бы вы попробовать следующее. (В случае, если кто-то просто хочет заменить последнюю _ и следующие цифры, могут помочь только следующие.

awk '{sub(/_[0-9]+$/,"",$1)} 1'  Input_file

2-е решение:

В случае, если вы хотите проверить, должно ли быть более 2 _ значений в 1-м поле, которое начинается со строки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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...