10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

行指向に jq コマンドを使う

Last updated at Posted at 2015-06-07

課題

以下のような Line Delimited な JSON ログファイルがあったとして、

input.json
{"a":"foo","b":"bar"}
{"a":"foo","b":"bar"}

jq コマンドを以下のように使うと、

$ cat input.json | jq -r '.a,.b'
foo
bar
foo
bar

のように行指向になっていなくて、そのあと awk とか grep とかに pipe でわたしてごにょごにょするのが辛い。

foo bar
foo bar

のように出力して欲しい

やりかた

以下のようにすると TSV に変換できて、行指向になる。

$ cat input.json | jq -r '"\(.a)\t\(.b)"'
foo	bar
foo	bar

スクリプト

覚えにくくて毎回打ってられない感あるので、ラッパースクリプトを書いた。名前はてきとうに jjq にした。

jjq
#!/bin/bash

usage_exit() {
    echo "Usage: $0 [-k keys] [file]"                                   1>&2
    echo ""                                                             1>&2
    echo "List specified keys of Line Delimited JSON file"              1>&2
    echo ""                                                             1>&2
    echo "  OPTIONS"                                                    1>&2
    echo "    -k keys    keys to output (multiple keys separated by ,)" 1>&2
    echo ""                                                             1>&2
    exit 1
}

while getopts k:Kh OPT
do
    case $OPT in
        k)  # Converting like "\(.foo)\t\(.bar)"
            KEYS=$(echo $OPTARG | sed 's/,/)\\t\\(./g')
            KEYS=$(echo "\"\(.$KEYS)\"")
            ;;
        h)  usage_exit
            ;;
        \?) usage_exit
            ;;
    esac
done
shift $((OPTIND - 1))

if [ $# -eq 0 ]; then
  exec jq -r "${KEYS}"
else
  FILE=${@:$#}
  exec jq -r "${KEYS}" $FILE
fi

これで以下のようにできるようになった。

$ cat input.json | jjq -k a,b

おしまい

10
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?