如何用sed和awk转换MariaDB中指定格式的文件内容?
问题
我有一个从MariaDB导出的制表符分隔表格文件,内容如下:
name callerid secret context type host 1000 Omar Al-Ani <1000> op1000DIR MANAGEMENT friend dynamic 1001 Ammar Zigderly <1001> 1001 MANAGEMENT peer dynamic 1002 Lubna COO Office <1002> 1002 ELdefault peer dynamic
需要将其转换成如下的INI格式:
[1000] callerid=Omar Al-Ani <1000> secret=op1000DIR context=MANAGEMENT type=friend host=dynamic [1001] callerid=Ammar Zigderly <1001> secret=1001 context=MANAGEMENT type=peer host=dynamic [1002] callerid=Lubna COO Office <1002> secret=1002 context=ELdefault type=peer host=dynamic
通过head -3 filename | od -c确认文件使用制表符作为分隔符。
解决方案
直接使用awk命令即可完成转换,无需结合sed,命令如下:
awk -F'\t' ' NR == 1 { for (i=2; i<=NF; i++) keys[i] = $i next } { printf "[%s]\n", $1 for (i=2; i<=NF; i++) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $i) printf "\t%s=%s\n", keys[i], $i } if (NR > 1) print "" }' input.txt > output.ini
命令说明
-F'\t':指定制表符为字段分隔符,匹配输入文件的格式。- 处理表头行(
NR == 1):将第2到最后一列的表头名称存入数组keys,后续用来对应数据字段。 - 处理数据行:
- 首先打印以
name字段值为名称的INI区块头,比如[1000]。 - 遍历第2到最后一列,用
gsub去除字段前后的空白字符(原数据部分字段带多余空格),然后按照\t键名=值的格式输出,实现缩进效果。 - 每处理完一条数据后打印空行,分隔不同区块(最后一行的空行可以保留,也可以通过调整条件去掉)。
- 首先打印以
这个命令可以精准生成你需要的INI格式,完全匹配需求。
内容的提问来源于stack exchange,提问作者resha
相关产品推荐
相关产品推荐

