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

How to extract specific rows based on row number from a file

我正在处理一个 RNA-Seq 数据集,该数据集由大约 24000 行(基因)和 1100 列(样本)组成,以制表符分隔。对于分析,我需要选择一个特定的基因集。如果有一种方法可以根据行号提取行,那将非常有帮助?这样对我来说比使用基因名称更容易。

下面是数据的例子 (4X4) -

gene    Sample1    Sample2    Sample3

A1BG       5658    5897      6064

AURKA    3656    3484      3415

AURKB    9479    10542    9895

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

我也在 biostars.org 上问过。

您可以使用 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

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

假设您有一个文件或一个程序可以生成您想要的行号列表,您可以使用 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 命令位于伪文件中,即不作为参数传递。


如果你不like/use bash处理替换,你可以这样做:

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