You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令说明

  1. -F'\t':指定制表符为字段分隔符,匹配输入文件的格式。
  2. 处理表头行(NR == 1):将第2到最后一列的表头名称存入数组keys,后续用来对应数据字段。
  3. 处理数据行:
    • 首先打印以name字段值为名称的INI区块头,比如[1000]。
    • 遍历第2到最后一列,用gsub去除字段前后的空白字符(原数据部分字段带多余空格),然后按照\t键名=值的格式输出,实现缩进效果。
    • 每处理完一条数据后打印空行,分隔不同区块(最后一行的空行可以保留,也可以通过调整条件去掉)。

这个命令可以精准生成你需要的INI格式,完全匹配需求。

内容的提问来源于stack exchange,提问作者resha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:21:01