如何根据文件中的行号提取特定行

时间:2018-05-16 07:15:48

标签: shell extract file-handling

我正在研究RNA-Seq数据集,该数据集由大约24000行(基因)和1100列(样本)组成,这些数据集是制表符分隔的。为了分析,我需要选择一个特定的基因组。如果有一种方法可以根据行号提取行,那将会非常有用吗?对我而言,这比基因名称更容易。

以下是数据示例(4X4) -

  

基因Sample1 Sample2 Sample3

     

A1BG 5658 5897 6064

     

AURKA 3656 3484 3415

     

AURKB 9479 10542 9895

据此,例如,我想要第1,3和4行,没有特定的模式

我也在biostars.org问过。

2 个答案:

答案 0 :(得分:2)

您可以使用for循环来构建sed选项,如下所示

var=-n
for i in 1 3,4 # Put your space separated ranges here
do
 var="${var} -e ${i}p"
done
sed $var filename

注意:在任何情况下,提及here的要求仍然会很痛苦,因为它涉及太多的输入。功能

答案 1 :(得分:1)

假设您有一个文件或一个生成所需行号列表的程序,您可以使用sed对其进行编辑,使其成为打印这些行并将其传递给第二次调用的脚本sed

具体而言,假设您有一个名为lines的文件,说明您想要哪些行(或者它可能同样是一个在stdout上生成行的程序):

1
3
4

您可以将其转换为sed这样的脚本:

sed 's/$/p/' lines
1p
3p
4p

现在您可以将其作为要执行的命令传递给另一个sed

sed -n -f <(sed 's/$/p/' lines) FileYouWantLinesFrom

这样做的好处是可以传递给脚本的最大参数长度,因为sed命令在伪文件中,即不作为参数传递。

如果您不喜欢/使用bash进程替换,您可以这样做:

sed 's/$/p/' lines | sed -n -f /dev/stdin FileYouWantLinesFrom