pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


タブ区切りテキストをJSONに変換するスクリプトをawkで書く

CSVやタブ区切りテキストをJSONに変換しようとすると、意外にスマートな方法が見当たらなかったので、タブ区切りテキストをJSONに変換するawkスクリプトを書いてみた。jqを使って工夫する例もあったけど、シンプルなデータをJSONに変換したいだけならこれで事足ります。

たとえば次のように先頭行にカラム名が入っているタブ区切りのデータがあったとして、

% cat test.txt 
id  name
1   foo
2   bar
3   bang

こんなふうに実行するだけで JSON になります。

% cat test.txt | ./tsv2json.awk 
[
  {
    "id": "1",
    "name": "foo"
  },
  {
    "id": "2",
    "name": "bar"
  },
  {
    "id": "3",
    "name": "bang"
  }
]

出力結果は jq でパースできることを確認済みなので、フォーマットは多分問題ないはず。

コードは、わりとやっつけ仕事な感じで書いたので、いけてない部分は残っていると思います。

#!/usr/bin/awk -f

BEGIN {
    FS="\t"
}

NR == 1 {
    for ( field = 1 ; field <= NF ; field++ ) {
        fieldname[field] = $field
    }
    next
}

{
    for ( field = 1 ; field <= NF ; field++ ) {
        data[NR, field]=$field
    }
}


END {
    print "["
    for ( record = 2 ; record <= NR ; record++ ) {
        print "  {"
        for ( field = 1 ; field < NF ; field++ ) {
            printf "    \"%s\": \"%s\",\n", fieldname[field], data[record, field]
        }
        printf "    \"%s\": \"%s\"\n", fieldname[NF], data[record, NF]

        if ( record != NR ) {
            print "  },"
        } else {
            print "  }"
        }
    }
    print "]"
}