shell - 分别从文本文件中处理具有特定模式边界的代码行?
问题描述
我已经使用这个脚本来提取名称 __libc_memalign 和 : 从 "file1" 到 "file 2" 之间所有出现的函数数据。现在文件 2 包含多个(6000 组)出现在此模式中的代码。如何遍历文件“file2”中的每个组并处理每个组?
`awk '/__libc_memalign/ {p=1;print;next} /:/ && p {p=0;print} p' file1.out >file2`
样本输入
0 0xc40840 : __libc_memalign
0 0x40bac0 0x7ffe493d0d50 W
0 0x40bac2 0x7ffe493d0d48 W
0 0x40bac4 0x7ffe493d0d40 W
..
0 0xc40840 : __libc_memalign
0 0x40bac0 0x7ffe493d0d50 R
0 0x40bac2 0x7ffe493d0d48 R
0 0x40bac4 0x7ffe493d0d40 R
....
0 0xc40840 : __libc_memalign
0 0x40bab0 0x7ffe493b0d50 W
0 0x40bab2 0x7ffe493dbd48 R
0 0x40bac4 0x7ffe493d0d40 W
解决方案
目前还不清楚您所说的“小组”或“过程”是什么意思,但希望至少这可以将您推向正确的方向。
假设您的组中没有空行,请在它们之间添加分隔符;然后循环空行之间的序列。你的 awk 脚本在完成一个组时似乎已经放了一个空行,所以你可以简单地
awk '/__libc_memalign/ {p=1; print; next}
/:/ && p {p=0; print} p' file1.out |
while true; do
while read -r line; do
case $line in '') break;; esac
echo "$line"
done |
# Pipe the collected group into "process
process
done
这是相当笨拙的,并且可能可以显着重构。如果您不是特别需要中间结果,也许只是
awk '/__libc_memalign/ {
p=1; cmd = "process" print | cmd; next}
/:/ && p { p=0; close(cmd) }
p { print | cmd }' file1.out
推荐阅读
- c++ - 成员函数在 C++ 编译期间是否可用?
- php - 在控制台找不到 Wordpress admin-ajax.php 404
- ios - Flutter FCM on resume on launch and on message not working in ios 缺少插件实现在启动时触发
- swift - 当我尝试从 OpenWeatherMap API 获取天气数据时,为什么我的 URL 会发生变化?
- php - 如何合并两个正则表达式模式模型?
- prolog - 检查结构是否是带有序言的二叉树
- sql - 如何在 Power BI 的折线图中显示星期几而不是日期?
- database - 具有两个角色的帐户之间的关系的最佳实践是什么?
- wpf - WPF 将菜单结构拆分为单独的用户控件
- javascript - 单元测试错误 - 失败:Angular 中模块“DynamicTestModule”声明的意外值“[object Object]”