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

时间:2014-02-19 10:20:05

标签: bash sed

问题如下。

文件:

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

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

此处的输出应为:

Name1
Name2

我已经尝试过:

  

sed -n“/ command /,/ done / p”|计数

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这可以是一种方式:

$ 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,请重置计数器。

答案 1 :(得分:2)

这个awk怎么样:

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

输出:

Name1
Name2

也就是说,如果该行以左对齐的大写字母开头,则将其保存为命令的名称并将计数器设置为-1 ...以便在“命令”下一行之后它将为零出现“。然后移动到下一行,没有进一步的麻烦。如果该行匹配字符串”done“并且计数器大于1,则打印我们之前保存的名称并移至下一行。增加所有其他行的计数器。

答案 2 :(得分: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