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

投稿者: Anonymous

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

csv 例:

NAME,AGE,GENDER
Jack,30,Male
Joe,25,Male
Mary,23,Female

実装したい関数の例:

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

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

解決

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

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=""
}

$ 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
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *