awk - 用另一行匹配模式后修改一行,然后用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
但是,这会删除第二个之后的所有其他列,我该如何保留这些列?
解决方案
$ 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,...,
推荐阅读
- java - 如何在 Android 中将多个选定的图像从图库转换为 PDF?
- java - Spring Saml2 SP 与 Angular 应用程序的集成(我已经在后端实现了 Saml2 安全性,现在我想从 Angular 应用程序连接到后端)
- python - 如何为布尔结果构建机器学习模型?
- javascript - reactjs中如何导出复合组件
- ghostdoc - 将 GhostDoc 文档移至
标记文件 - c# - 可观察管道中的异常处理
- sql - 我已设置算法但无法编写代码的 SQL 查询
- angular - 如果在 NX 工作区中生成预设为“空”的 Angular 项目,如何运行 e2e 测试?
- virtual-machine - 我们如何将端口转发到已经在端口上运行的服务器的 QEMU?
- r - 在一个 Dockerfile 中导入 R CRAN、Bioconductor 和 github R 包