模式与另一行匹配后修改一行,然后用awk删除另一行
Modify a Line after Matching Pattern with Another Line, Then Delete the Other Line with Awk
例如,假设我有以下几行:
1,r,other,columns,....,
4,w,...,
2,w,etc...
3,r
1,w
2,r
我希望我的输出写入文件(或覆盖现有文件)为:
1,r/w,other,columns,....,
4,w,...,
2,r/w,etc...
3,r
最终顺序无关紧要。
逗号分隔符行的第一个“行”是要匹配的模式,一旦匹配,一个将 'r' 和另一个 'w' 作为他们的第二行,我想像上面的例子一样把它们合并成一行。
更新
我已经设法让它与命令一起工作:
awk -F, '{a[]=a[]?a[] OFS :} END{for (i in a) print i FS a[i]}' OFS="/" file
但是,这会删除第二个之后的所有其他列,我该如何保留这些列?
$ cat tst.awk
BEGIN { FS=OFS="," }
{
key =
perms[key] = (key in perms ? perms[key] "/" : "")
}
!= "" {
sub(/([^,]*,){2}/,"")
vals[key] = [=10=]
}
END {
for (key in perms) {
print key, perms[key] (key in vals ? OFS vals[key] : "")
}
}
$ awk -f tst.awk file
1,r/w,other,columns,....,
2,w/r,etc...
3,r
4,w,...,
例如,假设我有以下几行:
1,r,other,columns,....,
4,w,...,
2,w,etc...
3,r
1,w
2,r
我希望我的输出写入文件(或覆盖现有文件)为:
1,r/w,other,columns,....,
4,w,...,
2,r/w,etc...
3,r
最终顺序无关紧要。
逗号分隔符行的第一个“行”是要匹配的模式,一旦匹配,一个将 'r' 和另一个 'w' 作为他们的第二行,我想像上面的例子一样把它们合并成一行。
更新
我已经设法让它与命令一起工作:
awk -F, '{a[]=a[]?a[] OFS :} END{for (i in a) print i FS a[i]}' OFS="/" file
但是,这会删除第二个之后的所有其他列,我该如何保留这些列?
$ cat tst.awk
BEGIN { FS=OFS="," }
{
key =
perms[key] = (key in perms ? perms[key] "/" : "")
}
!= "" {
sub(/([^,]*,){2}/,"")
vals[key] = [=10=]
}
END {
for (key in perms) {
print key, perms[key] (key in vals ? OFS vals[key] : "")
}
}
$ awk -f tst.awk file
1,r/w,other,columns,....,
2,w/r,etc...
3,r
4,w,...,