awk中的字段分隔符

问题描述

我有以下“ input.file”:

10      61694   rs546443136     T       G       .       PASS    RefPanelAF=0.0288539;AC=0;AN=1186;INFO=1.24991e-09      GT:DS:GP        0/0:0.1:0.9025,0.095,0.0025     0/0:0.1:0.9025,0.0025

我想要的输出文件是:

0.1,0.1,0.1

使用称为“ parse.awk”的awk脚本:

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

其中涉及:

awk -f parse.awk <input.file >output.file

我当前的输出文件如下:

0.1,0.1

即没有空格。

将pasre.awk更改为:

BEGIN {FS = ":"}
{for (i = 4; i <= NF; i += 2) printf ("%s%c"," : "\n ");}

没有更改output.file。对parse.awk进行哪些更改将产生所需的output.file?

解决方法

您可以使用此awk

awk -F: -v OFS=',' '{
  for (i = 4; i <= NF; i += 2) printf "%s%s",$i,(i < NF-1 ? OFS : ORS)}' file
0.1,0.1,0.1
,

能否请您尝试以下。编写并测试了 https://ideone.com/e26q7u

awk '
BEGIN {FS = ":"}
val!=""{ print val; val=""}
{for (i = 4; i <= NF; i += 2){
  val=(val==""?"":val",")$i
  }
}
END{
  if(val!=""){
    print val
  }
}
' Input_file
,

问题是当您将输出分隔符从单个逗号(",")更改为带空格的逗号(",")时;您没有将格式字符串从%c更改为%s。因此,这就是解决脚本的方法:

BEGIN {FS = ":"}
{for (i = 4; i <= NF; i += 2) printf ("%s%s",i +2 <= NF ? "," : "\n ");}
#                                         ^ Change this