ホーム>source

見つけたjq tsvをJSONファイルに変換するのに非常に役立ちますが、tsvに配列があるときにjqでそれを行う方法を見つけたいです:

name    age    pets
Tim    15    cats,dogs
Joe    11    rabbits,birds
...

理想的なJSON:

[
 {
  name: "Tim",
  age: "15",
  pet:["cats","dogs"]
 },
  name: "Joe",
  age: "11",
  pet:["rabbits","birds"]
 }, ...
]

これは私が試したコマンドです:

cat file.tsv | jq -s  --slurp --raw-input --raw-output 'split("\n") | .[1:-1] | map(split("\t")) |
        map({"name": .[0],
             "age": .[1],
             "pet": .[2]})'

上記のコマンドの出力は次のとおりです。

[
 {
  name: "Tim",
  age: "15",
  pet:"cats,dogs"
 },
  name: "Joe",
  age: "11",
  pet:"rabbits,birds"-
 }, ...
]

あなたの答え
  • 解決した方法 # 1

    名前にコンマが含まれている場合は、次のようにします。これにより、入力を「丸lurみ」する必要もなくなります。

    inputs
    | split("\t")
    | {name: .[0], age: .[1], pet: .[2]}
    | .pet |= split(",")
    
    

    ヘッダーをスキップするには、-Rオプションを指定してjqを呼び出すだけです。このような:

    jq -R -f program.jq input.tsv
    
    

    結果を配列として取得する場合は、上記のフィルター全体を角かっこで囲むだけです。

  • 解決した方法 # 2

    このような:

    jq -rRs 'split("\n")[1:-1] |
             map([split("\t")[]|split(",")] | {
                     "name":.[0],
                     "age":.[1],
                     "pet":.[2]
                 }
        )' input.tsv
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ linux kernel - スラブメモリ管理