我对 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/