【问题标题】:Using awk to detect // as an end of headers marker使用 awk 检测 // 作为标头标记的结尾
【发布时间】:2015-05-22 04:03:44
【问题描述】:

目前我正在使用以下命令解析脚本

ions 并且在文件中它应该只来自第一个数字(在本例中为五个)。第一个文件始终以模式[numeric] 开头。

只是一个快速的进一步任务:是否有一些额外的方法可以同时 grep 所有这些数字中的数字?

【问题讨论】:

  • 也许这更清楚一点?
  • @mat 有帮助吗?
  • @mat 这是一个很好的答案,是否有一种方法可以创建您回答的评论中提到的 foruth 文件?

标签: regex bash parsing awk


【解决方案1】:

您可以使用一个非常简单的状态机来做到这一点 - 只有两种状态:标题或正文。

curfile != FILENAME{body=0;curfile=FILENAME}
!body && /^\/\/$/    {body=1}
body  && /^\[/       {print > "first_"FILENAME}
body  && /^(seg|pos)/{print > "second_"FILENAME}
body  && /^[01]+/    {print > "third_"FILENAME}

首先在文件名更改时将body 设置为零/假(curfile 最初将被取消设置),并在看到标题分隔符时将其切换为一/真。其他规则仅适用于正文。

要从第一组行中提取第一个括号内的数字,使用这个简单的模式,您只需使用 substrindex string manipulation functions。应该执行以下操作:

body  && /^\[[0-9]+\]/ {
  print > "first_"FILENAME
  print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}

【讨论】:

  • 您甚至不必将body 设置为零,如果解释为布尔值,则(尚未)设置的变量的变量名将默认为false。
  • @heinheo:您希望这些行中每一行的第一个 [number] 放在单独的文件中,还是括号中的所有数字?
  • @mat 你能告诉我如何一次将多个文件输入该框架...我知道你使用文件名选项但是我在哪里输入我的 list.txt ?哪个 list.txt 包含我要解析的所有文件的文件名?
  • 如果 list.txt 包含您要解析的文件的名称,那么您在问题中的命令语法已经可以满足您的需求 - $(<file.txt) 片段会读取该文件并扩展其内容. (将因文件名包含空格而失败。)或仅单独列出所有文件或在命令末尾使用 glob 模式。 awk -f script.awk file1 file2 file3 some*patter? ...
  • 啊,抱歉没听懂。查看更新,这应该可以解决问题,@heinheo
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多