问题如下。
文件:
Name1
command
data1
data2
data3
done
Name2
command
data4
data5
done
Name1
command
data6
done
在上面的文件中,我想计算“命令”和“完成”之间的行,并给出一个名称列表,其中该计数大于1。
此处的输出应为:
Name1
Name2
我已经尝试过:
sed -n“/ command /,/ done / p”|计数
有什么想法吗?
答案 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