【问题标题】:Shell/Perl script to find and print string and some [closed]用于查找和打印字符串和一些 [关闭] 的 Shell/Perl 脚本
【发布时间】:2015-11-16 22:34:06
【问题描述】:

我目前正在尝试编写一个简单的 shell 脚本,该脚本将读取一个文件,查找某个字符串,然后打印该字符串和之后的几个字符。这个请求的上下文是我有一组我想运行的数据文件。这些文件包含一堆元素电离值。我正在尝试找到元素并打印出它的电离值。

这里的一个问题是数据文件还包含某些电离下的元素温度,因此至少有两个不同的情况下该元素会出现在文件中。每个数据文件都是非常标准的,所以我可以通过计算我想要的元素出现并只打印那个来解决这个问题,但我想知道是否有更好的方法来做到这一点。说先找到节标题“电离值”的位置,然后打印第一个出现的所述元素值。

这有意义吗?如果不是,请不要犹豫,要求澄清!

以下是输入的示例:

Log10  Mean Ionisation (over radius)
Hydrogen   -1.881 -0.006-10.514 (H2)
Helium     -1.433 -0.034 -1.410
Lithium    -3.769 -0.001 -2.531 -4.765
Beryllium  -1.896 -0.704 -0.107 -2.060 -5.793
Boron      -3.592 -0.118 -0.677 -1.570 -4.884
Carbon     -3.082 -0.350 -0.259 -2.707 -3.577 -8.864

Log10 Mean Temperature (over radius)
Hydrogen    4.068  4.068  4.068 (H2)
Helium      4.068  4.068  4.068
Lithium     4.068  4.068  4.068  4.068
Beryllium   4.068  4.068  4.068  4.068  4.068
Boron       4.068  4.068  4.068  4.068  4.068
Carbon      4.068  4.068  4.068  4.068  4.068  4.068

至于输出,我真正需要的只是元素的值。将它们打印到控制台就可以了

提前致谢。

【问题讨论】:

  • 假设您展示的是一个示例输入文件,在给定该输入的情况下也显示您想要的输出。
  • 两件事:输出应该是什么样子,到目前为止你尝试了什么?

标签: perl shell awk grep


【解决方案1】:

您可以将它保存在一个文件中并使用 2 个参数调用它,第一个是元素的名称,第二个是要搜索的文件的名称。元素名称区分大小写:

#!/bin/sh
sed -n "
    /Log10  Mean Ionisation (over radius)/,/^[[:space:]]*$/ {
        /^${1:?}/ p
    }
" "${2:?}"

sed 命令默认不打印任何内容 (-n),然后,对于“Log10 Mean Ionisation (over radius)”和下一个空白行之间的行,它将搜索由下式给出的模式(元素)第一个脚本参数,位于行首 (/^${1:?}),如果找到,则打印该行 (p)。

引用位置参数的${1:?} 和${2:?} 表示法会导致shell 打印错误消息并在未设置任何一个参数时退出。

【讨论】:

  • 谢谢!我想我将使用 grep 命令查找我希望打印的行,然后 awk 仅打印该行的一部分。现在弄清楚如何在某个标题之后找到第一次出现的元素。这是我刚刚使用的: grep -A 5 'Log10 Mean Ionisation (over radius)' FILE | grep '碳' | awk ...这可能不合适,但它有效!感谢您的帮助!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多