awk で、ヘッダ付き csv から、 ヘッダでカラムたちを抜き出すには？


以下のような、ヘッダ付き csv から、ヘッダを複数個、指定して、その列のみを出力したいと考えました。また、これを実現するにあたり、どこにでもある awk
で実装したいと考えました。

csv 例:

[code]

    NAME,AGE,GENDER
    Jack,30,Male
    Joe,25,Male
    Mary,23,Female
    
[/code]

実装したい関数の例:

[code]

    cat the_csv | extract_columns AGE GENDER
    # => AGE, GENDER の列だけが出力される。つまり:
    # 30,Male
    # 25,Male
    # 23,Female
    
[/code]

これは、どうやったら実現できますでしょうか。




印刷する列を抽出し、それらをループすることができます。

[code]

    BEGIN {FS=OFS=","; split(cols, names)}
    FNR==1 {
       for(i=1;i<=NF;i++) {          # extract column numbers to be printed
              for (n in names) {
                  if (names[n]==$i)
                      columns[i]=1
              }
       }
    next
    }
    {for (c in columns)              # loop through columns
        st=(st ? st FS : "") $c      # pick needed to print
     print st                        # print line
     st=""
    }
    
[/code]

### 例

[code]

    $ awk -v cols="AGE,NAME" -f script.wk file
    Jack,30
    Joe,25
    Mary,23
    $ awk -v cols="AGE,GENDER" -f script.wk file
    30,Male
    25,Male
    23,Female
    
[/code]




印刷する列を抽出し、それらをループすることができます。

[code]

    BEGIN {FS=OFS=","; split(cols, names)}
    FNR==1 {
       for(i=1;i<=NF;i++) {          # extract column numbers to be printed
              for (n in names) {
                  if (names[n]==$i)
                      columns[i]=1
              }
       }
    next
    }
    {for (c in columns)              # loop through columns
        st=(st ? st FS : "") $c      # pick needed to print
     print st                        # print line
     st=""
    }
    
[/code]

### 例

[code]

    $ awk -v cols="AGE,NAME" -f script.wk file
    Jack,30
    Joe,25
    Mary,23
    $ awk -v cols="AGE,GENDER" -f script.wk file
    30,Male
    25,Male
    23,Female
    
[/code]

