awk - 将没有标头的文件处理为格式为 header,record1,record2 的 csv

awk - 将没有标头的文件处理为格式为 header,record1,record2 的 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(请注意xy键后添加的空格):

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 Kislyukyqhttps://kislyuk.github.io/yq/创建原始文档中每个条目的顶级键的带引号的 CSV 记录以及 和xy。每个记录还具有作为单独字段添加的命令行末尾的字符串。

生成的输出将是无标头 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

我不确定yq在使用 Mike's 时如何避免添加额外的用户字符串而不将它们像这样注入到表达式中yq

答案2

使用任何 awk:

awk -F':' -v OFS=',' -v strs='<userstring1>,<userstring2>' '
    /^[^ ]/ { if (NR>1) print rec, strs; rec=$1; next }
    { rec = rec OFS $2 }
    END { print rec, strs }
' file
abcd,123,2345,<userstring1>,<userstring2>
pqrs,456,720,<userstring1>,<userstring2>
mnop,234,4567,<userstring1>,<userstring2>

相关内容