сохраните только определенную часть строки в определенном столбце

[1175091] Сверхкороткий ответ - 310 МБ (из моей системы, в которой могут быть установлены некоторые общие зависимости). Также он может изо дня в день конфликтовать с определенными частями ваших "обычных" операций. Вы также можете просто установить Kubuntu, так как это виртуальная машина в любом случае, и добавить все необходимые зависимости после.[1175092].
1
07.10.2014, 09:46
3 ответа
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)

0
27.01.2020, 23:13

Вы можете использовать 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]}" : просто распечатайте желаемый отпур.

1
27.01.2020, 23:13

Использование 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
6
27.01.2020, 23:13

Теги

Похожие вопросы