问题如下。
文件:
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