将文件拆分为键值对
split files to key value pair
Input file
- name: APPENV
value: STAGING
- name: ELASTICSEARCH_USER
value: elastic
- name: WRITE_LOGS_TO_ELASTICSEARCH
value: "true"
- name: version
value: "5"
预期输出:
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: "true"
version: "5"
尝试 awk -F "e:" '{print }' filename
仅提取键和值,但需要将其与上面的输出对齐。任何帮助将不胜感激
根据您展示的示例和尝试,请尝试遵循 awk
代码。
awk 'BEGIN{OFS=": "} /^- name:/{val=$NF;next} {print val,$NF}' Input_file
解释:简单的解释就是,首先设置OFS
(输出字段分隔符)为:
对于所有线路。在主 awk
程序中,检查行是否从 - name:
开始,然后将最后一个字段值分配给变量 val 并使用 next
将从这里跳过所有进一步的 awk
程序语句。当此条件(行从 - name:
开始)不为真时,则打印 val 和该行的最后一个字段。
编辑: 如果您的 Input_file 在 - name:
之前确实有空格,请尝试以下代码。
awk 'BEGIN{OFS=": "} /^[[:space:]]+- name:/{val=$NF;next} {print val,$NF}' Input_file
这个有效:
awk '
sub(/^[[:space:]]+- name: /, ""){n=[=10=]}
sub(/^[[:space:]]+value: /, ""){print n": "[=10=]}'
匹配并删除 name:
/value:
标签,并将两行的其余部分打印在一行上。
这看起来像 YAML 文件?在那种情况下,您可能应该使用专用的解析器,例如Mike Farah's yq :
yq e '.[] | .name + ": " + .value' infile
输出:
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: true
version: 5
使用 yq 版本 4.14.1 测试。
还有 awk
:
awk -v FS=': ' '!(NR%2){s=} (NR%2){if (s) print s ":", }' file
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: "true"
version: "5"
- “! 和 NR%2 是什么意思?”参见:
Input file
- name: APPENV
value: STAGING
- name: ELASTICSEARCH_USER
value: elastic
- name: WRITE_LOGS_TO_ELASTICSEARCH
value: "true"
- name: version
value: "5"
预期输出:
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: "true"
version: "5"
尝试 awk -F "e:" '{print }' filename
仅提取键和值,但需要将其与上面的输出对齐。任何帮助将不胜感激
根据您展示的示例和尝试,请尝试遵循 awk
代码。
awk 'BEGIN{OFS=": "} /^- name:/{val=$NF;next} {print val,$NF}' Input_file
解释:简单的解释就是,首先设置OFS
(输出字段分隔符)为:
对于所有线路。在主 awk
程序中,检查行是否从 - name:
开始,然后将最后一个字段值分配给变量 val 并使用 next
将从这里跳过所有进一步的 awk
程序语句。当此条件(行从 - name:
开始)不为真时,则打印 val 和该行的最后一个字段。
编辑: 如果您的 Input_file 在 - name:
之前确实有空格,请尝试以下代码。
awk 'BEGIN{OFS=": "} /^[[:space:]]+- name:/{val=$NF;next} {print val,$NF}' Input_file
这个有效:
awk '
sub(/^[[:space:]]+- name: /, ""){n=[=10=]}
sub(/^[[:space:]]+value: /, ""){print n": "[=10=]}'
匹配并删除 name:
/value:
标签,并将两行的其余部分打印在一行上。
这看起来像 YAML 文件?在那种情况下,您可能应该使用专用的解析器,例如Mike Farah's yq :
yq e '.[] | .name + ": " + .value' infile
输出:
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: true
version: 5
使用 yq 版本 4.14.1 测试。
还有 awk
:
awk -v FS=': ' '!(NR%2){s=} (NR%2){if (s) print s ":", }' file
APPENV: STAGING
ELASTICSEARCH_USER: elastic
WRITE_LOGS_TO_ELASTICSEARCH: "true"
version: "5"
- “! 和 NR%2 是什么意思?”参见: