使用 awk 解析输入并打印多列?

使用 awk 解析输入并打印多列?

我的输入文件行格式是:

themostsimpleproject', branch 'debug_randomnness' : AFFECTED. Affected image discovered: [7.19, 8.37]

我想使用 awk 打印 - 项目名称和受影响图像的版本。例子:

themostsimpleproject 7.19, 8.37

我怎样才能在 awk 中做到这一点。我更喜欢可以通过命令行执行的简单代码。前任:awk -F"\," 'print $1 $4'。但简单的脚本也是受欢迎的。

注意:我不想'在项目名称末尾打印。

答案1

尝试使用以下方法awk

awk -F "[]'[]" '/: AFFECTED/{print $1, $(NF-1)}' input
  • -F定义字段分隔符 (FS)。它是一个正则表达式字符串,其中包括一个字符类( [..]),意思是“字符类中包含的任何一个字符”,是字段分隔符。

    • 这里选择的字符是',[]
    • 必须]放在第一位,以避免被视为结束字符。 (你也可以逃脱!)
  • 第一个字段$1以第一个结尾',因此项目名称为 $1

  • 受影响的版本是$(NF-1).正如]最后一个字符一样,$NF将为空。

输出:

themostsimpleproject 7.19, 8.37

这将搜索带有 String 的行: AFFECTED,然后输出所有图像版本,即使受影响的版本不止 2 个。

答案2

 awk -F "'" '{gsub(/:.*:/,"",$NF);gsub(/[\]\[]/,"",$NF);print $1,$NF}' filename

输出

themostsimpleproject   7.19 8.37

答案3

您还可以使用sed

$ sed "s/^\(.*\)',.*\[\(.*\)\]$/\1 \2/" file
themostsimpleproject 7.19, 8.37

或者使用 GNU 版本

$ sed -E "s/^(.*)',.*\[(.*)\]$/\1 \2/" file 
themostsimpleproject 7.19, 8.37

答案4

还带有awk

awk '{gsub(/[][]/,"");gsub(/[[:punct:]]/,"",$1);print $1, $(NF-1),$NF}' file
themostsimpleproject 7.19, 8.37 
  • 我们删除了[field1中的所有标点符号]gsub()
  • 然后我们打印第一个字段和最后两个字段。

相关内容