Bash - один вкладыш для сортировки файла постели в столбце qvalue, а затем извлечения 20% строк с наибольшим значением q - PullRequest
0 голосов
/ 23 мая 2018

У меня есть файл bed в следующем формате:

chr start   end q-value   name
chr1    10004  10467    310.43    peak_1
chr2    15410  15704    19.61 peak_2
chr3    21207  21354    4.04  peak_3
chr4    26073  26165    25.32 peak_4
chr5   63044057  63044425   39.65  peak_5

Если возможно, мне нужна однострочная строка bash для сортировки этого файла по столбцу q-value (столбец 4), затем мне нужноизвлечь верхние 20% строк с самым высоким значением q.

После сортировки это будет выглядеть следующим образом:

chr start   end q-value   name
chr1    10004  10467    310.43    peak_1
chr5   63044057  63044425   39.65  peak_5
chr4   26073  26165    25.32 peak_4
chr2    15410  15704    19.61 peak_2
chr3    21207  21354    4.04  peak_3

После процентов это будет выглядеть следующим образом:

chr1    10004  10467    310.43    peak_1

Мне нужно запустить это для более 40 файлов.

Я также знаком с R, поэтому, если это невозможно в bash, но выполнимо в R, код R также будет полезен (но предпочтительнее Bash).

Большое спасибо.


Редактировать комментарии:

Сделан код более тестируемым.

Re: моя собственная попытка

Когда я попытался запустить sort -k4 file.txt в первую очередь.Я получил следующее, что не то, что я ищу:

chr2    15410  15704    19.61 peak_2
chr4    26073  26165    25.32 peak_4
chr1    10004  10467    310.43    peak_1
chr5   63044057  63044425   39.65  peak_5
chr3    21207  21354    4.04  peak_3

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

1 Ответ

0 голосов
/ 23 мая 2018

Это то, на что вы смотрите?

#!/bin/sh
sort -r -g -k 4,4 < inputFile.file > tempfile_sorted.out
lncnt=$(wc -l < tempfile_sorted.out)
percent_linecount_infloat=$(echo "$lncnt*.2" | bc)
float2Int=$(printf %.0f "$percent_linecount_infloat")
head_20_percent=$(head -"$float2Int" tempfile_sorted.out)
new_fn=$(printf "%s_20" tempfile_sorted.out) # new file with top 20% of sorted output
printf "$head_20_percent" > $new_fn
...