使用awk从文件中分隔数字范围

时间:2016-01-29 12:43:47

标签: awk

我有一个包含5列的文件,我想使用数字范围作为标准来分隔列:示例:

chr1    2120987 2144159     NM_001282670    0.48106
chr1    2123333 2126214     NM_001256946    2.71647
chr1    4715104 4837854     NM_001042478    0
chr1    4715104 4843851     NM_018836   0
chr1    3728644 3773797     NM_014704   4.61425
chr1    3773830 3801993     NM_004402   4.39674
chr1    3773830 3801993     NM_001282669    0
chr1    6245079 6259679     NM_000983   75.1769
chr1    6304251 6305638     NM_001024598    0
chr1    6307405 6321035     NM_207370   0.273874
chr1    6161846 6240194     NM_015557   0.0149477
chr1    6266188 6281359     NM_207396   0
chr1    6281252 6296044     NM_012405   14.0752

我想从列表中删除0,然后想要在0.01到0.27之间排序数字等等.... 我是shell编程的新手....有人可以帮助awk吗? 感谢。

2 个答案:

答案 0 :(得分:0)

由于您不熟悉shell编程,因此您可能不了解grepsort这项工作会更简单。

如果你是awk作为你选择的工具,那么请忽略我的答案。

我会这样做:

grep -v '\s0$' file | sort -k 5,5 -g

chr1    6161846 6240194     NM_015557   0.0149477
chr1    6307405 6321035     NM_207370   0.273874
chr1    2120987 2144159     NM_001282670    0.48106
chr1    2123333 2126214     NM_001256946    2.71647
chr1    3773830 3801993     NM_004402   4.39674
chr1    3728644 3773797     NM_014704   4.61425
chr1    6281252 6296044     NM_012405   14.0752
chr1    6245079 6259679     NM_000983   75.1769

带有grep的{​​{1}}会反转搜索并查找不包含序列-v的行,后跟零后跟行尾。 space对第5列的数据进行排序,并根据sort执行常规数字排序。

答案 1 :(得分:0)

如果你试图选择$ 5非零且在一定范围内的行,那么确实awk是有意义的,以下内容可能接近你之后:

awk -v min=0.01 -v max=0.27 '
  $5 == 0 { next }
  min <= $5 && $5 <= max { print }'

这里,对awk的调用已被参数化,以建议如何调整这几行以用于更一般的用法。