合并其他所有列

问题描述

试图从$3开始合并所有其他制表符delim列

NC_044998.1     3757    ref     ref     ref     ref     ref     ref     ref     ref     ref     dev

所以输出

NC_044998.1     3757    refref     refref     refref     refref     refdev

使用

awk 'BEGIN {FS = "\t"} {for (i=3; i<=12; i+=2) {gsub(/\t/,"",$i)1;} print $0};' input

输出与输入相同

解决方法

使用 GNU awk:

awk 'BEGIN {FS=OFS="\t"} { for (i=0; i<5; i++){$(i+3)=$(i*2+3) $(i*2+4)} NF=7; print }' input

输出:

NC_044998.1     3757    refref  refref  refref  refref  refdev

这是怎么回事?

  • 第3列获取第3列和第4列的内容。
  • 第4列获取第5列和第6列的内容。
  • 第5列获取第7列和第8列的内容。
  • 第6列获取第9列和第10列的内容。
  • 第7列获取第11列和第12列的内容。
  • 列的输出限于前7列(NF=7)。

请参阅:8 Powerful Awk Built-in Variables – FS,OFS,RS,ORS,NR,NF,FILENAME,FNR

,

使用gnu awk,您可以使用正则表达式执行此操作:

awk -F '\t' -v beg=2 '{
   s=""
   for (i=1; i<=beg; ++i)
      s = s $i FS;
   print s gensub( /\t+(\S+\t*)/,"\\1","g",substr($0,length(s)+1) )
}' file
NC_044998.1  3757   refref  refref  refref  refref  refdev

PS:您可以在此awk命令中将任何其他列位置作为beg参数