sed -e 'h;s/.*intron_[^:]*\(:[^[:space:]]*\).*/\1/;s/./ /g;;G;;s/\(.*\)\n\(.*\)intron_\([^:]*\):[^[:space:]]*/\2\3\1/' YourFile
в 1 SED (без трубы) поддержание колонны. Он использует версию POSIX Buffer
(SO - POSIX
в GNU SED)
Вы можете использовать PERL
:
$ perl -anle '
BEGIN {$" = "\t"}
print "@{[@F]}" and next if $. == 1;
$F[1] = $1 if /_([^:]*):/;
print "@{[@F]}";
' file
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
3 FBgn0027570 54 0
Объяснение
-
: Автоматическое разделение каждую строку в массив @F
.
Начало {$ "=" \ t "}
: мы устанавливаем сепаратор списка к вкладке \ T
, он используется, когда нарезка массива или массива интерполизирована в двойной цитируемой строке.
Печать «@ {[@ f]}» и следующая, если $. == 1
: мы распечатаем заголовок, процесс в следующую строку.
$ f [1] = $ 1, если / _ ([[^ :] *): /
: Получаем значение между _
и первым :
: , сохранить его до второго элемента в @F
.
Print "@ {[@ f]}"
: просто распечатайте желаемый отпур.
SED
и и
и
: $ sed -E 's/ intron_([^:]*):[^[:space:]]*/ \1/' file | column -t
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
Ключевая часть этого является команда замены:
s/ intron_([^:]*):\S*/ \1/
ищет INTONR_
и сохраняет все После Intorn_
и до первой кишки в переменной 1
. [^ [: Space:]] *
Соответствует всему от этой толстой кишки до конца поля. Все это заменяется текстом, сохраненным в переменной 1
.
AWK
с выходом разделенного вкладками: $ awk -v "OFS=\t" '{$2=$2;sub(/intron_/, "", $2); sub(/:.*/, "", $2); print}' file
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
Объяснение:
-V «OFS = \ T»
Это устанавливает сепаратор вывода поля на вкладку. Это помогает выстроить колонны, возможно, создавать колонна
ненужным.
$ 2 = $ 2
При печати строки awk
не изменится на наш вновь указанный сепаратор вывода, если мы не изменим что-то на линии. Назначение второго поля во втором поле достаточно, чтобы обеспечить, чтобы вывод будет иметь вкладки.
Sub (/ intron_ /, ", $ 2)
Это удаляет Intron_
со второго поля.
Sub (/:.*/, "", $ 2)
Это удаляет все после первой толстой кишки со второго поля.
Печать
Это печатает нашу новую строку.
AWK
с настраиваемым форматированием колонны Это похоже на вышеупомянутое, но использует printf
, чтобы мы могли настроить ширины и выравнивание столбцов по желанию:
$ awk '{sub(/intron_/, "", $2); sub(/:.*/, "", $2); printf "%-3s %-12s %8s %3s\n",$1,$2,$3,$4}' file
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
здесь Операция printf "% -3s% -12% 8s% 3s \ n", 1, $ 2, $ 3, $ 4
Выбирает ширину и выравнивание столбцов в обычном стиле Printf
.
SED
и преобразования из вкладок, разделенных на запятую $ sed -E 's/ intron_([^:]*):[^[:space:]]*/ \1/; s/[[:space:]][[:space:]]*/,/g' file
id,target_id,length,eff_length
1,FBgn0000721,1136,243.944268
1,FBgn0000721,1122,240.237419
2,FBgn0264373,56,0