次の形式のデータファイルがあります
abcd:
x:123
y:2345
pqrs:
x:456
y:720
mnop:
x:234
y:4567
:
:
awk形式のCSVにどのように変換しますか?
abcd,123,2345,<userstring1>,<userstring2>
pqrs,456,720,<userstring1>,<userstring2>
mnop,234,4567<userstring1>,<userstring2>
ベストアンサー1
仮説入力は実際には正しい形式のYAMLです(x
およびキーy
の後にスペースが追加されます)。
abcd:
x: 123
y: 2345
pqrs:
x: 456
y: 720
mnop:
x: 234
y: 4567
(例が実際のデータを表すと仮定すると、各行:
の最初の行の後にスペースを追加するだけで、データをこの形式に変換できますsed 's/:/: /'
。)
これをCSV形式のデータセットに変換し、次のように最後に静的文字列を含むフィールドを追加できます。
yq -r 'to_entries|map([.key, .value.x, .value.y, $ARGS.positional[] ] | @csv)[]' file --args "userstring1" "userstring2"
これはAndrey Kislyukyq
のものを使用しますhttps://kislyuk.github.io/yq/元の文書内の各項目の最上位キーと合計x
値の引用符付きCSVレコードを生成しますy
。各レコードには、コマンドラインの末尾に別々のフィールドとして追加された文字列もあります。
生成された出力はヘッダーレスCSVファイルです。
"abcd",123,2345,"userstring1","userstring2"
"pqrs",456,720,"userstring1","userstring2"
"mnop",234,4567,"userstring1","userstring2"
Mike Farahの実装(Andreyなどのyq
多機能プロセッサを取り囲むラッパーではない)を使用したい場合は、次のことができます。jq
yq
yq 'to_entries|map([.key, .value.x, .value.y, "userstring1", "userstring2"]) | @csv' file
yq
Mike'sを使用するときは、この式に追加のユーザー文字列を挿入せずに追加のユーザー文字列を追加することを避ける方法がわかりませんyq
。