我在文件中有以下行
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
来实现?请告诉我是否需要循环?
我正在使用Solaris 10;本地sed
不 GNU sed
(因此没有-r
选项,也没有-E
)。
答案 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"
)