Bash 脚本:在 2 个单词之间的 linex 计数之前获取值



问题如下。

文件:

Name1
  command
  data1
  data2
  data3
  done
Name2
  command
  data4
  data5
  done
Name1
  command
  data6
  done

在上面的文件中,我想计算"命令"和"完成"之间的行,并给出一个名称列表,其中这个计数大于 1。

此处的输出应为:

Name1
Name2

我尝试过:

sed -n "/command/,/done/p" | count

有什么想法吗?

这可能是一种方法:

$ awk '/done/ {if (t>1) print name} {t++} /^Name/ {name=$0} /command/ {t=0}' a
Name1
Name2

解释

  • /done/ {if (t>1) print name}如果该行包含 done ,则仅在计数器> 1 时打印块的标题。
  • 在任何情况下{t++}递增计数器。
  • /^Name/ {name=$0}存储行值。
  • /command/ {t=0}如果该行包含 command ,则重置计数器。

这个尴尬怎么样:

awk '/^[A-Z]/{name=$0;count=-1;next}/done/&&count>1{print name;next}{count++}' file

输出:

Name1
Name2

也就是说,如果该行以左对齐的大写字母开头,请将其另存为命令的名称并将计数器设置为 -1 ...这样当"命令"出现时,下一行之后它将为零"。然后毫不费力地转到下一行。如果该行与字符串"done"匹配并且计数器大于 1,请打印我们之前保存的名称并移动到下一行。所有其他行的增量计数器。

如果Name不是固定字符串,则可以使用:

awk '/command/{cmd=1; n=0;next} !cmd{p=$1;next} cmd{n++} /done/{if (n>2) print p; cmd=0; next}' dat
Name1
Name2

相关内容

  • 没有找到相关文章

最新更新