【问题标题】:awk approach to subset file based on three columns基于三列的子集文件的awk方法
【发布时间】:2021-05-26 13:08:23
【问题描述】:

我有一个 .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,而第三列。

我尝试使用 awk

awk -F '$1 == "A" && $2 >= 715 && $3 <= 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       +

【问题讨论】:

    标签: awk subset


    【解决方案1】:

    请使用您显示的示例尝试以下操作。假设您的 Input_file 是空格分隔的,那么我们不需要使用空格分隔符,因为这是 awk 的默认分隔符(在您尝试的代码中,没有为字段分隔符设置值会导致问题)。如果您有选项卡作为字段分隔符,请在以下代码中将 awk 更改为 awk 'BEGIN{FS=OFS="\t"}

    awk '$1=="A" && $2>=715 && $3<=1367' Input_file
    

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

    注意: 对于 OP 的声明:

    第二列的值大于 715,小于的值 1367 在第三列。

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

    awk '$1=="A" && $2>715 && $3<1367' Input_file
    

    【讨论】:

    • 这很好用,谢谢!但是为什么我的单行代码会收到一条错误消息?您删除了数学运算符之间的间隙并删除了“-F”参数,对吗?
    • @AennaPhD,是的,如解决方案中所述,默认字段分隔符是空格,您无需设置它,您的语法也不正确,这就是其中的固定内容。
    • “那里的语法也不正确”是什么意思?谢谢!
    • @AennaPhD,您可以给字段分隔符,例如:-F'\t'(将制表符设为字段分隔符)或-F'abc'(将 abc 设为字段分隔符)为整个文件制作字段分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多