unix - Unix 中使用多个分隔符分割行

标签 unix awk sed split

我的文件中有以下几行

id=1234,name=abcd,age=76
id=4323,name=asdasd,age=43

除了真实文件每行还有更多 tag=value 字段。 我希望最终的输出是这样的

id,name,age
1234,abcd,76
4323,asdasd,43

我希望 = 之前(左侧)的所有值都以 , 分隔作为第一行,并且希望 = (右侧)之后的所有值都以 , 分隔每行下面的 =

有没有办法用awksed来做到这一点?请告诉我是否需要 for 循环?

我正在开发 Solaris 10;本地 sed 不是 GNU sed(因此没有 -r 选项,也没有 -E )。

最佳答案

$ cat tst.awk
BEGIN { FS="[,=]"; OFS="," }
NR==1 {
    for (i=1;i<NF;i+=2) {
        printf "%s%s", $i, (i<(NF-1) ? OFS : ORS)
    }
}
{
    for (i=2;i<=NF;i+=2) {
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

$ awk -f tst.awk file
id,name,age
1234,abcd,76
4323,asdasd,43

假设它们实际上并不存在于您的输入中,我在运行上述代码之前删除了使您的示例变得困惑的 ... 等。如果您的输入中确实存在这些内容,请澄清您希望如何识别和删除文本“(n 个字段)”(字符串匹配?在线位置?其他内容?)。

编辑:因为您喜欢 cat|head|sed 的简洁性; cat|sed 方法发布在另一个答案中,这是 awk 中的等效方法:

$ awk 'NR==1{h=$0;gsub(/=[^,]+/,"",h);print h} {gsub(/[^,]+=/,"")} 1' file
id,name,age
1234,abcd,76
4323,asdasd,43

关于unix - Unix 中使用多个分隔符分割行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471616/

相关文章:

linux - 我如何使用linux编写基本脚本?

java - jsch-->无法使用java从unix跳转服务器连接到另一个unix服务器

linux - 用于 sed 替换的转义文件名

c - 用管道 fork

linux - Less - 一次搜索多个文件

linux - 使用命令行工具进行大量 XML 编辑

linux - awk 数组的键值问题

linux - 目标是从显示信息中提取视频驱动程序版本,然后将其与支持的版本列表进行比较

linux - 当两个模式之间至少有一行时,通过 sed/AWK 打印两个模式之间的行

python - 打印匹配行和匹配行之前的一行