【问题标题】:Print first and every nth column using awk使用 awk 打印第一列和每第 n 列
【发布时间】:2023-02-04 00:37:10
【问题描述】:

我想打印制表符分隔文件中的第一列 (gene) 和所有 raw_counts 列。

我试过了:

BEGIN {FS = "\t"}
{for (i = 3; i <= NF; i += 1) printf ("%s%c", $i, i + 1 <= NF ? "\t" : "\n");}

但输出与输入相同。

awk -f prog.awk < 输入.csv > 输出.csv

原始标题:

gene    raw_counts      median_length_normalized        RPKM    raw_counts      median_length_normalized        RPKM   raw_counts       median_length_normalized        RPKM    raw_counts      median_length_normalized        RPKM   raw_counts     

预期输出(标题):

gene    raw_counts      raw_counts     raw_counts       raw_counts      raw_counts   

【问题讨论】:

  • 不要只显示标题,在示例输入/输出中包含一些数据。当第一个 raw_counts 是字段 2 时,为什么要从字段 3 开始循环?如果要打印基因列,为什么不也打印 $1 呢?

标签: linux awk command-line


【解决方案1】:

一些调整:

  • 2开始循环计数器
  • 在每次通过时将循环计数器增加+3

修改OP的代码:

$ awk 'BEGIN {FS=OFS="	") {printf "%s",$1; for (i=2;i<=NF;i+=3) printf "%s%s",OFS,$i}' input.csv    
gene    raw_counts      raw_counts      raw_counts      raw_counts      raw_counts

【讨论】:

    【解决方案2】:

    你可以这样做:

    awk 'BEGIN{FS=OFS="	"}
    FNR==1{
        header[1]
        for(i=2;i<=NF;i++) if($i=="raw_counts") header[i]
    }
    {
        for (i=1;i<=NF;i++) 
            if(i in header) {printf("%s%s", sep, $i); sep=OFS}
        print ""
    }' file 
    

    但是第一次,它打印你的标题,从那时起只打印与这些标题相关的值。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2021-11-25
      相关资源
      最近更新 更多