Grep все символы в каждой строке перед матчем - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть файл с десятками тысяч строк, разделенных табуляцией, например:

cluster11586    TRINITY_DN135758_c4_g1_i1   5'-adenylylsulfate reductase-like 4 9.10921
cluster41208    TRINITY_DN130890_c2_g1_i1   Anthranilate phosphoribosyltransferase, chloroplastic   18.5398
cluster26862    TRINITY_DN132510_c1_g1_i2   ATP synthase subunit alpha, mitochondrial   4.82626
cluster13001    TRINITY_DN130890_c4_g1_i3   Phosphopantetheine adenylyltransferase  2.58108

Я хотел бы использовать grep / awk / sed для создания файла с текстом после первых двух столбцови перед последним десятичным числом, с удаленными табуляциями и заменой пробелов на подчеркивания:

5'-adenylylsulfate_reductase-like_4
Anthranilate_phosphoribosyltransferase,_chloroplastic
ATP_synthase_subunit_alpha,_mitochondrial
Phosphopantetheine_adenylyltransferase

Я думал о том, чтобы извлечь все до последнего десятичного числа, которое я могу сопоставить с [0-9]+\.[0-9]+$, а затемпередать результат в нечто похожее на awk '{$1=$2=""; print $0}', чтобы удалить первые два столбца (и, надеюсь, и следующую вкладку), а затем отправить его на sed -e 's/ /_/g' Но как можно извлечь текст перед последним десятичным числом в каждой строке, безполучение самого десятичного числа, ни предшествующих пробелов?И, похоже, awk покидает вкладку после удаления первых двух столбцов.Могу ли я сделать все это без вывода промежуточных файлов?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вы можете сделать:

$ cut -d $'\t' -f 3- file | 
  sed -nE 's/^(.*)[[:space:]][[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*/\1/; s/[[:space:]]*$//; s/[[:space:]]/_/gp'
5'-adenylylsulfate_reductase-like_4
Anthranilate_phosphoribosyltransferase,_chloroplastic
ATP_synthase_subunit_alpha,_mitochondrial
Phosphopantetheine_adenylyltransferase

Поскольку последнее десятичное число разделено табуляцией, вы можете больше полагаться на cut, чтобы найти поля и использовать только sed, чтобы изменить ' ' до _:

$ cut -d $'\t' -f 3- file | cut -d $'\t' -f 1 | sed -E 's/[[:space:]]/_/g'
0 голосов
/ 03 декабря 2018

Понимание этого даст вам хорошее представление о том, как awk работает с полями и разделителями полей для разделения и рекомбинации записей:

$ awk '{$1=$2=$NF=""; $0=$0; OFS="_"; $1=$1; OFS=FS} 1' file
5'-adenylylsulfate_reductase-like_4
Anthranilate_phosphoribosyltransferase,_chloroplastic
ATP_synthase_subunit_alpha,_mitochondrial
Phosphopantetheine_adenylyltransferase

По шагам:

$ awk '{$1=$2=$NF=""; print "<" $0 ":" $1 ">"}' file
<  5'-adenylylsulfate reductase-like 4 :>
<  Anthranilate phosphoribosyltransferase, chloroplastic :>
<  ATP synthase subunit alpha, mitochondrial :>
<  Phosphopantetheine adenylyltransferase :>

$ awk '{$1=$2=$NF=""; $0=$0; print "<" $0 ":" $1 ">"}' file
<  5'-adenylylsulfate reductase-like 4 :5'-adenylylsulfate>
<  Anthranilate phosphoribosyltransferase, chloroplastic :Anthranilate>
<  ATP synthase subunit alpha, mitochondrial :ATP>
<  Phosphopantetheine adenylyltransferase :Phosphopantetheine>

$ awk '{$1=$2=$NF=""; $0=$0; $1=$1; print "<" $0 ":" $1 ">"}' file
<5'-adenylylsulfate reductase-like 4:5'-adenylylsulfate>
<Anthranilate phosphoribosyltransferase, chloroplastic:Anthranilate>
<ATP synthase subunit alpha, mitochondrial:ATP>
<Phosphopantetheine adenylyltransferase:Phosphopantetheine>

$ awk '{$1=$2=$NF=""; $0=$0; OFS="_"; $1=$1; OFS=FS; print "<" $0 ":" $1 ">"}' file
<5'-adenylylsulfate_reductase-like_4:5'-adenylylsulfate>
<Anthranilate_phosphoribosyltransferase,_chloroplastic:Anthranilate>
<ATP_synthase_subunit_alpha,_mitochondrial:ATP>
<Phosphopantetheine_adenylyltransferase:Phosphopantetheine>
0 голосов
/ 03 декабря 2018

Удалить первые 2 комбинации (строка без табуляции),
запомнить следующую часть, которая не будет заканчиваться цифрой,
и соответствовать десятичному числу.

sed -r 's/([^\t]*\t){2}(.*[^0-9])[0-9]*[.][0-9]*$/\2/' file

Nechtдве простые замены

sed -r 's/([^\t]*\t){2}(.*[^0-9])[0-9]*[.][0-9]*$/\2/;s/ /_/g;s/\t//g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...