awk - ヘッダーのないファイルをヘッダー、レコード1、レコード2形式のCSVとして処理します。

awk - ヘッダーのないファイルをヘッダー、レコード1、レコード2形式のCSVとして処理します。

次の形式のデータファイルがあります

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多機能プロセッサを取り囲むラッパーではない)を使用したい場合は、次のことができます。jqyq

yq 'to_entries|map([.key, .value.x, .value.y, "userstring1", "userstring2"]) | @csv' file

yqMike'sを使用するときは、この式に追加のユーザー文字列を挿入せずに追加のユーザー文字列を追加することを避ける方法がわかりませんyq

おすすめ記事