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