首页 > 解决方案 > 用另一行匹配模式后修改一行,然后用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[$1]=a[$1]?a[$1] OFS $2:$2} END{for (i in a) print i FS a[i]}' OFS="/" file

但是,这会删除第二个之后的所有其他列,我该如何保留这些列?

标签: awkcommand-line

解决方案


$ cat tst.awk
BEGIN { FS=OFS="," }
{
    key = $1
    perms[key] = (key in perms ? perms[key] "/" : "") $2
}
$3 != "" {
    sub(/([^,]*,){2}/,"")
    vals[key] = $0
}
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,...,

推荐阅读