我的文件中有以下几行
id=1234,name=abcd,age=76
id=4323,name=asdasd,age=43
除了真实文件每行还有更多 tag=value
字段。
我希望最终的输出是这样的
id,name,age
1234,abcd,76
4323,asdasd,43
我希望 =
之前(左侧)的所有值都以 ,
分隔作为第一行,并且希望 =
(右侧)之后的所有值都以 ,
分隔每行下面的 =
有没有办法用awk
或sed
来做到这一点?请告诉我是否需要 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/