parsing - 读取半格式化数据

标签 parsing awk

我对 AWK 完全陌生,但我认为这是解决我的问题的最佳方法,也是学习 AWK 的好时机。 我正在尝试读取由模拟程序创建的大数据文件。输出是为了人类可读,因此其格式不太一致。输出示例如下图所示 /image/KsreH.png

我需要一种方法来找到像“He 2 4686A -2.088 0.0071”这样的行,通过指定“He 2 4686A”部分并获取以下两个数字。问题是“He 2 4686A -2.088 0.0071”行可能出现在表中的任何位置。 我知道如何找到条目“He 2 4686A”,但我不知道它位于 4 列中的哪一列中。所以我不知道如何处理它后面的值。 一个命令可以让我读取接下来的两个单词,或者在找到匹配项后告诉我模式的位置,这两者都会有帮助。

/He 2 4686A/找到该行

Ca A 3970A -0.900 0.1100 He 2 4686A -2.088 0.0071 S 3 18.67m -0.371 0.3721 Ar 4 444.7A -2.124 0.0066

感谢任何帮助。

最佳答案

第一步应该是将看似 4 列的记录转换为 1 列格式...然后使用 awk 就很容易了,因为您可以过滤前 5 个字段 - 例如:

echo "He 2 4686A -2.088 0.0071" | \
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}'

这给出了

-2.088 0.0071

所以,对我来说,唯一的挑战是将数据转换为单列格式...从图片来看,这看起来很简单,因为列似乎具有可以计算的固定长度。

假设您的列宽为 30 个字符(很难从图片中看出,请注意制表符)并且您的数据位于 input_file 中,那么您可以首先将数据“剪切”为 4 列然后将输出通过管道传输到另一个 awk-process

awk '{
  print substr($0,1,30)
  print substr($0,31,30)
  print substr($0,61,30)
  print substr($0,91,30)
}' input_file | \
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}'

如果您确实只需要 anchor 后面的接下来的两个数字,那么我会说 Costa 的 grep 解决方案最适合您,但这使您有可能实现进一步的逻辑...

关于parsing - 读取半格式化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994008/

相关文章:

Linux 命令中的命令

python - 在 Python 中实现 "rules engine"

linux - 如何使用 bash 脚本修改多个文件

linux - 从一个表中的多行获取输出

java - 如何在 Java 中断言文本时跳过一行

awk - 更改文本文件的外观

bash - 在 awk 脚本中提取字符串的一部分

java - 在 JDOM/DOM 中禁用 XML 实体解析

java - 解析一个巨大的纯文本文件

python - 在 Python 中从 SIP URI 解析电话号码