python - grep、awk、bash 和 friend ?有什么工具可以处理这些数据吗?

标签 python perl bash awk

我正在搜索输入以提取有关每条记录的特定信息。可悲的是,每条记录都分布在多行中,例如(简化摘录)

01238584 (other info) more info, more info
[age=81][otherinfo][etc, etc]

我唯一真正关心的是标识符和年龄(0123858481,在示例中)。明确地说,我可以在输入中可靠地搜索以接近这两行的唯一正则表达式是

\[age=[0-9]+\]

...当然我想打印出那个年龄以及上面一行的识别记录号,例如

 01238584   81

凭借我所有的 sysadmin shell 经验和对 awk 的熟练掌握,我还没有想出解决方案。我当然可以使用 grep -B1 来获取每组行,但是然后呢?我总是将 awk 用于此类事情......但相关数据总是在同一行中。 叹息这绝对超出了我目前的 awk 技能范围。

感谢阅读。有任何指示吗?


编辑
我将接受 Charlie 的建议并更改 awk 的记录分隔符,这是我以前从未做过的。它不漂亮,但输入也不是。工作完成。

egrep -B1 '\[age=[0-9]+\]' inputfile |
awk '
  BEGIN{ RS = "--" }
  { printf "%s  %s\n", $1, gensub(/.*\[age=([0-9]+)\].*/, "\\1", 1) }'

最佳答案

你能展示更多的输入文件吗?例如,如果数据记录由空行分隔,您可以使用 Awk 中的 RS 特殊变量更改记录分隔符,使其将多行视为一条记录。 (参见,例如 http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_19.html)

无论如何,我很想做一些将所有数据记录放在一行或一个逻辑记录中的操作。

如果你不能那样做,但你知道记录 ID 总是在年龄标签之前的行上,那么在 Python 中使用 readlines 很容易做到,它将整个文件读入一个行列表,就像这样

 with open("file.dat") as f:
     lines = f.readlines()
     for ix, line in enumerate(lines):
         if # line has age field
            # get record from lines[ix-1]

或者,当然,您始终可以将上一行保留在 Awk 的内存中

 BEGIN { prevline = "" }
       { # process the line
         prevline = $0
       }

关于python - grep、awk、bash 和 friend ?有什么工具可以处理这些数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11706962/

相关文章:

bash - 从 Bash 函数返回字典

python - 字符串反转只反转一半的字符串

python - Optimized_execution() 需要 1 个位置参数,但给出了 2 个

linux - 命令行(甚至以编程方式)检索图像的一部分

perl - 如何在不实际解包的情况下获取 Perl 中打包项目的数量?

perl - 我如何需要一个不是属性的 Moose 构造函数参数?

bash - 如何使用 bash 和 sed 操作文件名?

python - Flask + Flask-Security + Babel 不工作

python - 在 `python` 上运行 R 代码,语法错误 : keyword can't be an expression error Message

perl - 无法打开 Perl 脚本 "Build.PL": No such file or directory in response to perl Build. PL