Awk 行的特定打印
我有包含几行的数据。有些行以值1000.0、500.0、300.0开头,在这些行之间还有其他行。我想要的是:Awk 行的特定打印,awk,grep,Awk,Grep,我有包含几行的数据。有些行以值1000.0、500.0、300.0开头,在这些行之间还有其他行。我想要的是: 打印包含1000.0的行之后的行 后跟包含500.0的行 后跟包含300.0的行 典型数据如下所示(附图片): 所需输出为: 969.0 306.9 356.7 309.9 500.0 318.9 318.9 300.0 344.2 3
- 打印包含1000.0的行之后的行
- 后跟包含500.0的行
- 后跟包含300.0的行
969.0 306.9 356.7 309.9
500.0 318.9 318.9
300.0 344.2 344.2
数据模式有以下几行
我尝试过的是
egrep -R "`grep -A1 "1000.0" file |awk '{print $1}'`|500.0|300.0" file
它将结果显示为:参数列表太长请查看并建议最佳解决方案 您没有说明如何处理键值的重复出现,或者500.0和300.0是否必须按该顺序出现,因此这可能是您真正想要的,也可能不是您真正想要的,但它适用于已发布的示例输入以及您到目前为止告诉我们的内容:
$ cat tst.awk
f == 1 { print; f=2 }
$1 == "1000.0" { f=1 }
f && $1 == "500.0" { print }
f && $1 == "300.0" { print; f=0 }
$ awk -f tst.awk file
969.0 306.9 356.7 309.9
500.0 318.9 318.9
300.0 344.2 344.2
要在您的评论中处理新的43520要求(未经测试):
grep
唯一的解决方案:
grep -A1 "1000.0" file | grep -v "1000.0" && grep -E '500.0|300.0' file
希望有帮助。事实上,这些值是按顺序出现的。我的意思是这种模式有好几次出现。此外,有时1000.0缺失,但存在500.0和300.0,那么我们需要忽略这些值,转到下一个模式,其中1000.0、500.0、300.0同时出现。我检查了输出,它似乎按照我的要求工作!是的,考虑到这些要求,它将完全满足您的要求。与前一种情况一样,如果在1000.0之前的几行之前有一行,以43250开头,并且我们希望包含该行,而其余行与旧行相同,那么awk脚本中需要做哪些修改。结果如下:打印包含43520的行打印包含1000.0的行之后的行,然后是包含500.0的行,最后是包含300.0的行。我在答案末尾添加了一个修改过的脚本。如果这还不行,那么就发布一个新问题。谢谢你的帮助,但不幸的是,第二个代码没有给出期望的结果!
$1 == "43520" { s = $0 }
f == 1 { print s ORS $0; f=2 }
$1 == "1000.0" { f=1 }
f && $1 == "500.0" { print }
f && $1 == "300.0" { print; f=0 }
grep -A1 "1000.0" file | grep -v "1000.0" && grep -E '500.0|300.0' file