【问题标题】:How to select columns of data for a new file based on an if statement?如何根据 if 语句为新文件选择数据列?
【发布时间】:2019-01-23 19:34:31
【问题描述】:

我正在从最初的大型数据集中对数据进行子集化。 我设法从这个原始数据中选择了我想要的新文件的列数,但随后尝试根据 if 语句进行进一步选择(要求我的新文件的第 28 列仅包含

awk 'BEGIN{FS="\t"} { for(i=125; i<=NF; ++i) printf $i""FS; print ""}' Bigfile.txt> Smallfile.txt

awk 'BEGIN{FS="\t"} {if($28<=5000) print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$28}' Smallfile.txt > Smallfile1.txt

第一行 awk 工作正常,从我的原始数据集中选择了我想要的 28 列。第二行不会让我进一步细分。我尝试删除 BEGIN,添加 ;在某些地方,并使用 -F"\t" 而不是 {FS="\t"}

【问题讨论】:

    标签: shell unix if-statement awk


    【解决方案1】:

    请您尝试关注一次。由于您主要担心的是您的输出不是以制表符分隔的格式出现,因此在BEGIN 部分中设置OFS="\t" 的值应该注意这一点。

    现在谈到您的第二个问题,您需要打印我已经放置 FNR==1{print;next} 条件的标题(FNR==1 表示它正在检查行号是否为 1,然后执行以下操作。然后 @987654325 @ 将打印第一行,nextawk 的开箱即用函数,它将跳过此处的所有进一步语句)。由于您没有展示样品,所以我无法对其进行测试。

    awk 'BEGIN{FS=OFS="\t"} FNR==1{print;next} {if($28<=5000) print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$28}' Smallfile.txt > Smallfile1.txt
    

    【讨论】:

    • 这很好用,现在我明白为什么了,谢谢!
    • @DN1,很高兴它对您有所帮助,当您在帖子中看到很少的答案时,您可以选择其中任何一个作为正确答案。继续学习并继续在这个伟大的网站上发帖。
    • 我注意到的一件事是,我尝试使用新行进行进一步的子集化,再次正常工作,但重复我的第 28 列给我一个没有标题的第 29 列,这是对我来说不是问题,但发生这种情况的原因是什么?我的新行是: awk 'BEGIN{FS=OFS="\t"} FNR==1{print;next} {if($10=="Significant") print $1,$2,$3,$4,$5,$6, $7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$28}' Smallfile1.txt > Smallfile2.txt
    • @DN1,我相信你有2次$28.$28最后你的命令是什么原因?请将其更改为$28,$29,然后让我知道。再次没有看到样品,我只是按照你的解释。
    • @DN1,如果您不想对我们需要打印的字段编号进行硬编码,那么您可以使用 for 循环包括条件直到您需要运行它的字段编号等. 然后要么创建一个连接自己的值的变量,直到所有必需的字段值都被读取,要么使用 printf 继续在单行中打印它们,最后字段打印一个新行。试一试。
    【解决方案2】:

    您尝试执行的任务显然可以在单个 awk 脚本中完成。

    您的第一个 awk 脚本从第 125 列开始选择所有列。第二个 awk 脚本根据第 28 列的值进行二次选择。

    这也是等价的:

    awk 'BEGIN{FS=OFS="\t"}
         (FNR==1) || ($(125+28-1) <= 5000) {
             for(i=125;i<=NF;++i) printf (i==125?"":OFS) $i; printf ORS
         }' BigFile > SmallFile1
    

    这是有效的,因为 awk 与 pattern { action } 对一起工作,说明如果满足 pattern,则执行 action。这里的模式是(FNR==1) || ($(125+28-1) &lt;= 5000),表示如果我们正在处理文件(FNR==1) 的第一条记录或(||)第28 列大于或等于5000 ($(125+28-1) &lt;= 5000),则满足pattern

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2012-10-23
      • 2011-08-22
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多