сохранить строки с наибольшим диапазоном

закройте одинарную кавычку, в которую вы помещаете регулярное выражение, измените одинарную кавычку и снова откройте ее

$ echo "a'b" | sed 's/'\''/X/'
aXb

$ echo "aXb" | sed 's/X/'\''/'
a'b
0
18.01.2021, 19:44
2 ответа

Я пришел к этому с учетом новой информации

awk -F'[ =-]' '{ print $0" "$6-$5 | "sort -k4nr" }' fileA | \
cut -d' ' -f1-3 | \
awk -F'[ =]' '!seen[$3]++'

Выход:

>ENST00000366955.7 gene=WASP12 CDS=169-9511
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032

Это, безусловно, можно сделать с помощью одной команды awk, но я все еще учусь ее использовать.



Предыдущий ответ до редактирования ОП:

Учитывая минимальное значение, скажем, 700 (, соответствующее выходным данным вашего образца ), вы можете попробовать это:

awk -F'[=-]' '$4-$3 > 700' fileA

Выход:

>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511

-F'[=-]':используйте =и -в качестве разделителей столбцов, что приводит к столбцам 3 и 4:

1 526
138 579
1 81
160 4752
304 1032
169 9511

$4-$3 > 700:Выберите строки, в которых столбец 4 минус столбец 3 больше 700.

3
18.03.2021, 22:36

Предполагая, что диапазоны всегда представлены на положительной цепочке и никогда в противоположной ориентации, и предположив, что столбцы в исходном файле разделены одинарными пробелами,

$ awk -F '[ =-]' '{ k = $3; r = $6 - $5 } (m[k] == "" || m[k] < r) { d[k] = $0; m[k] = r } END { for (k in d) print d[k] }' file
>ENST00000366955.7 gene=WASP12 CDS=169-9511
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000423485.5 gene=PTP2 CDS=160-4752

Это обрабатывает данные как строки с полями, разделенными пробелами, =и -. Таким образом, длина диапазона находится путем вычитания 6-го поля из 5-го поля. Максимальный такой диапазон для любого имени гена хранится в массивеm(для «максимум» ), а соответствующие строки хранятся в массивеd(для «данные» ).

В конце выводятся собранные данные в d.

Код awkс более приятным форматированием:

BEGIN { FS = "[ =-]" }

{
    k = $3
    r = $6 - $5
}

(m[k] == "" || m[k] < r) {
    d[k] = $0
    m[k] = r
}

END {
    for (k in d) print d[k]
}
2
18.03.2021, 22:36

Теги

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