Bash - 在qvalue列上对床文件进行排序的一个衬垫然后提取具有最高q值的前20%的行

时间:2018-05-23 11:26:39

标签: r bash sorting filtering percentage

我有一个以下格式的床文件:

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 one-liner来对q值列(第4列)中的这个文件进行排序,然后我需要提取具有最高q值的前20%的行。

排序后,这将是:

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更好)。

非常感谢。

修改评论

使代码更易于测试。

回复:我自己的尝试

当我尝试在第一个实例中运行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 :(得分:1)

这是你在看什么?

#!/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