按标题名称打印确定列,并在其上显示空格(awk,sed)

时间:2016-04-07 08:54:55

标签: bash awk sed

我想根据标题名称从文件中提取某些列。某些名称具有空格(文件以制表符分隔)。我无法删除或替换空格,因为下游应用程序将受到影响。我正在寻找的是根据标题名称提取一些列,并按照我希望的顺序输出它们

以下是我的文件示例:

 Sample Note Intragenic Rate ABCDE_177447
 1032 NA 0.97867626 0.9300704670625763 0.72782564
 ABCDE_177447 NA 0.97836965 1.0 0.87218356 
 ABCDE_188399 NA 0.97859967 0.905527730405171 0.81188565
 ABCDE_189595 NA 0.9787659 0.9059075892313707 0.8089241
 ABCDE_189596 NA 0.9788054 0.9065243881070291 0.8092951

我想要的输出;

 Sample Intragenic ABCDE_177447
 1032 0.97867626 0.9300704670625763 0.72782564
 ABCDE_177447 0.97836965 0.87218356 
 ABCDE_188399 0.97859967 0.81188565
 ABCDE_189595 0.9787659 0.8089241
 ABCDE_189596 0.9788054 0.8092951

我尝试过这个解决方案AWK extract columns from file based on header selected from 2nd file

但它不能使用名称上的空格,并且对此解决方案也是如此Extracting columns from a file

我也试过这个

$cat cols.awk

BEGIN {
 n=split(cols,col)
 for (i=1; i<=n; i++) s[col[i]]=i
}
NR==1 {
 for (f=1; f<=NF; f++)
   if ($f in s) c[s[$f]]=f
 next
}
{ sep=""
 for (f=1; f<=n; f++) {
   printf("%c%s",sep,$c[f])
   sep=FS
 }
 print ""
}

但是当我像awk -F\t -f cols.awk.sh -v cols="Note,Sample,Intragenic Rate" metrics.txt那样运行我的脚本时,我收到了以下错误:

awk: illegal field $(), name "1"
 input record number 2, file metrics.txt
 source line number 12

2 个答案:

答案 0 :(得分:1)

你可以使用这个awk:

awk -v cols='Sample,Intragenic,ABCDE_177447' 'BEGIN{FS=OFS="\t"; nc=split(cols, a, ",")} NR==1{for (i=1; i<=NF; i++) hdr[$i]=i} {for (i=1; i<=nc; i++) if (a[i] in hdr) printf "%s%s", $hdr[a[i]], (i<nc?OFS:ORS)}' file

Sample  Intragenic  ABCDE_177447
1032    0.97867626  0.72782564
ABCDE_177447    0.97836965  0.87218356
ABCDE_188399    0.97859967  0.81188565
ABCDE_189595    0.9787659   0.8089241
ABCDE_189596    0.9788054   0.8092951

使用cols命令行参数,您可以传递以逗号分隔的列列表进行打印。

这是更具可读性的awk:

awk -v cols='Sample,Intragenic,ABCDE_177447' 'BEGIN {
   FS=OFS="\t"
   nc=split(cols, a, ",")
}
NR==1 {
   for (i=1; i<=NF; i++)
      hdr[$i]=i
}
{
   for (i=1; i<=nc; i++)
      if (a[i] in hdr)
         printf "%s%s", $hdr[a[i]], (i<nc?OFS:ORS)
}' file

答案 1 :(得分:0)

awk '{sub(/Note Intragenic Rate/,"Intragenic")}{sub(/NA/, "")}NR>2{sub($3, "")}1' file

Sample Intragenic ABCDE_177447
1032  0.97867626 0.9300704670625763 0.72782564
ABCDE_177447  0.97836965  0.87218356 
ABCDE_188399  0.97859967  0.81188565
ABCDE_189595  0.9787659  0.8089241
ABCDE_189596  0.9788054  0.8092951