AWK根据列名称显示列,并删除标题和最后一个定界符 [英] AWK to display a column based on Column name and remove header and last delimiter

查看:142
本文介绍了AWK根据列名称显示列,并删除标题和最后一个定界符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Id,responseId,name,test1,test2,bcid,stype
213,A_123456,abc,test,zzz,987654321,alpha
412,A_234566,xyz,test,xxx,897564322,gama
125,A_456314,ttt,qa,yyy,786950473,delta
222,A_243445,hds,test,fff,643528290,alpha
456,A_466875,sed,test,hhh,543819101,beta

我想从上面提取列responseId和bcid.我找到了一个非常接近的答案

I want to extract columns responseId, and bcid from above. I found an answer which is really close

awk -F ',' -v cols=responseID,bcid '(NR==1){n=split(cols,cs,",");for(c=1;c<=n;c++){for(i=1;i<=NF;i++)if($(i)==cs[c])ci[c]=i}}{for(i=1;i<=n;i++)printf "%s" FS,$(ci[i]);printf "\n"}' <file_name>

但是,它在末尾和标题中显示,",如下所示.

however, it prints "," in the end and the header as shown below.

responseId,bcid,
A_123456,987654321,
A_234566,897564322,
A_456314,786950473,
A_243445,643528290,
A_466875,543819101,

如何使其不打印bcid后的页眉和,"?

How can I make it to not print the header and the "," after bcid??

推荐答案

输入

$ cat infile
Id,responseId,name,test1,test2,bcid,stype
213, A_123456, abc, test, zzz, 987654321, alpha
412, A_234566, xyz, test, xxx, 897564322, gama
125, A_456314, ttt, qa, yyy, 786950473, delta
222, A_243445, hds, test, fff, 643528290, alpha
456, A_466875, sed, test, hhh, 543819101, beta

脚本

$ cat byname.awk 
FNR==1{
    split(header,h,/,/);
    for(i=1; i in h; i++)
    {
        for(j=1; j<=NF; j++)
        {
            if(tolower(h[i])==tolower($j)){ d[i]=j; break } 
        }
    }
    next
}
{
    for(i=1; i in h; i++)
        printf("%s%s",i>1 ? OFS:"",  i in d ?$(d[i]):"");
    print "";
}

如何执行?

$ awk -v FS=, -v OFS=, -v header="responseID,bcid" -f byname.awk  infile
 A_123456, 987654321
 A_234566, 897564322
 A_456314, 786950473
 A_243445, 643528290
 A_466875, 543819101

单线

$ awk -v FS=, -v OFS=, -v header="responseID,bcid" 'FNR==1{split(header,h,/,/);for(i=1; i in h; i++){for(j=1; j<=NF; j++){if(tolower(h[i])==tolower($j)){ d[i]=j; break }}}next}{for(i=1; i in h; i++)printf("%s%s",i>1 ? OFS:"",  i in d ?$(d[i]):"");print "";}' infile
 A_123456, 987654321
 A_234566, 897564322
 A_456314, 786950473
 A_243445, 643528290
 A_466875, 543819101

这篇关于AWK根据列名称显示列,并删除标题和最后一个定界符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆