基于三列的子集文件的awk方法

awk approach to subset file based on three columns

我有一个 .BED 格式的文件 (input.bed)

less input.bed
A     678     934     0bb6fdb5    0       +
A     715     986     8bc17666    0       +
A     716     1029    065f9d32    0       -
A     769     1367    572ae096    0       +
B     801     924     e6f469bf    0       +
B     876     1007    384622c7    0       +
B     921     1118    9f8bdbbb    0       -
C     1038    1841    f9a29a0g    0       +
C     1078    1929    9cd655be    0       +

我想从 LINUX 命令行中对文件进行子集化,并生成一个新文件,其中包含第一列中带有“A”的所有行、第二列中大于 715 的值以及一个第三列中的值小于 1367。

我试过使用 awk

awk -F ' == "A" &&  >= 715 &&  <= 1367' input.bed > output.bed

但我收到错误消息:

awk: cmd. line:1: input.bed
awk: cmd. line:1:      ^ syntax error

所需的输出如下所示

less output.bed
A     715     986     8bc17666    0       +
A     716     1029    065f9d32    0       -
A     769     1367    572ae096    0       +

请尝试按照您显示的示例进行操作。假设您的 Input_file 是 space 分隔符,那么我们不需要使用 space 分隔符,因为这是 awk 的默认分隔符(在您尝试的代码中,没有为字段分隔符设置值是引起问题)。如果您使用制表符作为字段分隔符,请在以下代码中将 awk 更改为 awk 'BEGIN{FS=OFS="\t"}

awk '=="A" && >=715 && <=1367' Input_file

解释: 简单的解释就是,如果第一个字段是 A,第二个字段大于或等于 715,则检查 2 个条件AND 第三个字段小于或等于 1367 然后打印该行。一旦您对上面的代码(将在终端上打印行)感到满意,然后附加 > output.bed 以从程序中获取输出文件。

注意: 对于 OP 的声明:

a value larger than 715 in the second column, and a value smaller than 1367 in the third column.

如果我们不想包含 715 和 1367 值,则将条件更改为:

awk '=="A" && >715 && <1367' Input_file