在Unix中使用多个分隔符拆分行

时间:2015-12-26 13:08:41

标签: 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来实现?请告诉我是否需要循环?

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

4 个答案:

答案 0 :(得分:2)

$ 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

假设它们确实存在于您的输入中,我在运行上述内容之前删除了使您的示例混乱的...等。如果您的输入确实存在这些内容,请说明您希望文本&#34;(n个字段)&#34;被识别和删除(字符串匹配?在线位置?还有什么?)。

编辑:既然你喜欢在另一个答案中发布的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

答案 1 :(得分:0)

FILE=yourfile.txt

# first line (header)
cat "$FILE" | head -n 1 | sed -r "s/=[^,]+//g"

# other lines (data)
cat "$FILE" | sed -r "s/[^,]+=//g"

答案 2 :(得分:0)

sed -r '1 s/^/id,name,age\n/;s/id=|name=|age=//g' my_file

编辑:或使用

sed '1 s/^/id,name,age\n/;s/id=\|name=\|age=//g'

输出

id,name,age
1234,abcd,76 ...(n number of fields)
4323,asdasd,43...

答案 3 :(得分:0)

以下简单地结合了迄今为止最好的基于sed的答案,显示你可以吃蛋糕并吃掉它。如果你的sed不支持-r选项,很可能-E会做到这一点;所有其他方法都失败了,可以用RR *代替R +,其中R是[^,]

sed -r '1s/=[^,]+//g; s/[^,]+=//g'

(也就是说,便携式咒语将是:

sed "1s/=[^,][^,]*//g; s/[^,][^,]*=//g"