首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AWK从文件中根据列的名称选择列

使用AWK从文件中根据列的名称选择列
EN

Stack Overflow用户
提问于 2022-11-15 19:48:53
回答 1查看 29关注 0票数 0

我有一个文件,其中包含一个标题和信息。

代码语言:javascript
复制
zcat majorfile.gz | head -n 3 | cut -d ' ' -f1-10

marker alleleA alleleB FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged FINCH_WB_C049985_splitMerged FINCH_WB_C049985_splitMerged FINCH_WB_C049985_splitMerged FINCH_WB_C071898_splitMerged
LR761571.1_34273 G C 0.9955 0.0045 0 0.9996 0.0004 0 1
LR761571.1_34285 G A 0.9934 0.0066 0 0.9999 0.0001 0 0.9435

我想根据列名对该文件进行子集:

代码语言:javascript
复制
cat header.subset.txt | head
marker
alleleA
alleleB
FINCH_WB_633_splitMerged
FINCH_WB_ES1B002_splitMerged
FINCH_WB_JH1417_splitMerged
FINCH_WB_JH1452_splitMerged
FINCH_WB_JH1495_splitMerged
FINCH_WB_JP000_splitMerged
FINCH_WB_JP004_splitMerged

我有多个"header.subset.txt“文件,所以我要遍历它们。

代码语言:javascript
复制
for file1 in header.subset.txt 
do 
awk 'NR==FNR{a[$1]++;next} {if(FNR==1){for(i=1;i<=NF;i++){if(a[$i]){printf $i" ";b[i]=$i}}}else{printf "\n";for(j=1;j<=NF;j++){if(b[j]) {printf $j" "}}}}END {printf "\n"}' \
  $file1 \
  majorfile.gz > majorfile_sub.gz
done 

awk命令适用于带选项卡分隔字段的文件,但不适用于空格(如本例中所示)。

在这个例子中,它会给出:

代码语言:javascript
复制
marker alleleA alleleB FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged
LR761571.1_34273 G C 0.9955 0.0045 0
LR761571.1_34285 G A 0.9934 0.0066 0

编辑:下面是由gawk -o-格式化的awk代码,以便更容易阅读(但显然仍然缺少有意义的变量名):

代码语言:javascript
复制
NR == FNR {
        a[$1]++
        next
}

{
        if (FNR == 1) {
                for (i = 1; i <= NF; i++) {
                        if (a[$i]) {
                                printf $i " "
                                b[i] = $i
                        }
                }
        } else {
                printf "\n"
                for (j = 1; j <= NF; j++) {
                        if (b[j]) {
                                printf $j " "
                        }
                }
        }
}

END {
        printf "\n"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 20:47:08

OP当前代码的一个变体:

代码语言:javascript
复制
awk '
#BEGIN  { FS=OFS="\t" }                             # uncomment if input/output fields are tab delimited
FNR==NR { headers[$1]; next }
        { sep=""
          for (i=1; i<=NF; i++) {
              if (FNR==1 && ($i in headers)) {
                 fldids[i]
              }
              if (i in fldids) {
                 printf "%s%s",sep,$i
                 sep=OFS                            # if not set elsewhere (eg, in a BEGIN{}block) then default OFS == <space>
              }
          }
          print ""
        }
' header.subset.txt <(zcat majorfile.gz)

这就产生了:

代码语言:javascript
复制
marker alleleA alleleB FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged FINCH_WB_633_splitMerged
LR761571.1_34273 G C 0.9955 0.0045 0
LR761571.1_34285 G A 0.9934 0.0066 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74451358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档