特定の列を名前で印刷するには?

特定の列を名前で印刷するには?

次のファイルがあります。

id  name  age
1   ed    50
2   joe   70   

id私は印刷と列だけが欲しいですage。今、私は次を使いますawk

cat file.tsv | awk '{ print $1, $3 }'

ただし、これには列番号を知る必要があります。列番号の代わりに列名(最初の行に指定)を使用する方法はありますか?

ベストアンサー1

たぶん、次のようなものがあります。

$ cat t.awk
NR==1 {
    for (i=1; i<=NF; i++) {
        ix[$i] = i
    }
}
NR>1 {
    print $ix[c1], $ix[c2]
}
$ awk -f t.awk c1=id c2=name input 
1 ed
2 joe
$ awk -f t.awk c1=age c2=name input 
50 ed
70 joe

コマンドラインに印刷する列を指定するには、次のようにします。

$ cat t.awk 
BEGIN {
    split(cols,out,",")
}
NR==1 {
    for (i=1; i<=NF; i++)
        ix[$i] = i
}
NR>1 {
    for(i=1; i <= length(out); i++)
        printf "%s%s", $ix[out[i]], OFS
    print ""
}
$ awk -f t.awk -v cols=name,age,id,name,id input 
ed 1 ed 50 1 
joe 2 joe 70 2 

-vブロックで定義された変数を取得するためのスイッチに注意してくださいBEGIN。)

おすすめ記事