【问题标题】:Modify a Line after Matching Pattern with Another Line, Then Delete the Other Line with Awk用另一行匹配模式后修改一行,然后用awk删除另一行
【发布时间】:2021-10-16 00:02:15
【问题描述】:

例如,假设我有以下几行:

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

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

【问题讨论】:

标签: awk command-line


【解决方案1】:
$ 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,...,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多