【问题标题】:Extract data from a subsection of a file using Shell commands or Perl [closed]使用 Shell 命令或 Perl 从文件的一个小节中提取数据 [关闭]
【发布时间】:2014-06-27 17:00:34
【问题描述】:

我正在尝试从文件的特定部分(在某个点下)提取信息。更准确地说,我希望能够查找关键字,例如“M2”,然后在 M2 下找到“Freq”以获得该数字,而不会与 M1 或 M3 混淆。

最简单的答案很可能是 grep、sed、awk 或 cut 的组合。

M1{

频率:1GHz

温度:125℃

}

M2{

频率:1.1GHz

温度:130℃

}

M3{

频率:0.78GHz

温度:89℃

}

【问题讨论】:

  • 如果你可以使用 awk,那么使用 grep 或 sed 或 cur 就毫无意义,因为 awk 可以做所有这些甚至更多。
  • 这个问题似乎是题外话,因为它是关于众包脚本编写的。作者没有尝试解决方案。

标签: perl bash shell sed grep


【解决方案1】:

使用 perl 单行代码

perl -ne 'print $1 if /M2\{/ .. /\}/ and /Freq:\s*(.*)/' file

说明:

开关

  • -n:为输入文件中的每个“行”创建一个 while(<>){..} 循环。
  • -e:告诉perl 在命令行上执行代码。

代码

  • /M2\{/ .. /\}/:用于测试两行之间的范围运算符
  • /Freq:\s*(.*)/:查找匹配行,并在$1 中捕获值。

【讨论】:

  • 谢谢@Miller。如果您不介意,我想为您扩展我的问题。我希望你调整你的答案以适应我的扩展。如果不是“频率:1.1Ghz”,我有:“频率:{ CONDITION { f
  • 频率:{ \n 条件 { f
  • 感谢您的即兴考虑。希望我们在这里有更多像你这样的人!
  • 这基本上是一个奇怪的脚本,我想把它的某些部分变成真正的 Perl 脚本——当然是在找到正确的小节并正确阅读之后。我知道如何做进一步的操作。我很新手。
  • @user3761870 当您也有数据要共享时,评论不是扩展问题的有用地方。我建议您在原始问题的底部添加一个编辑。
【解决方案2】:

试试

awk '/M2/ {found=1} found && $1=="Freq:" {print $2; exit}' file

【讨论】:

    【解决方案3】:

    你可以使用 awk,

    $ awk -v RS="\s*M" 'NR==3{print $3}' file
    1.1GHz
    

    【讨论】:

      【解决方案4】:
      perl -lane 'print $F[1] if /M2[{]/ .. /[}]/ and /Freq/' file
      

      【讨论】:

      • @AvinashRaj tnx 发表评论。
      【解决方案5】:

      perl 的另一种方式

      perl -nle 'chomp; $str.="$_"; END{ $str =~ /M2\{.*?(Freq: .*?\s)/ && print $1 }' file
      Freq: 1.1GHz 
      

      解释:

      1. chomp 删除 \n
      2. $str.="$_" 用整个输入创建一个字符串
      3. $str =~ /M2\{.*?(Freq: .*?\s) 提取我们需要的字段

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 2013-09-29
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多