Linux中如何获取两个单词之间的行数

Linux中如何获取两个单词之间的行数,linux,unix,awk,grep,Linux,Unix,Awk,Grep,以下是我的源文件的模式: Col1 Col2 col3 colN START-OF-DATA val1|val2|val3|valN val1|val2|val3|valN val1|val2|val3|valN val1|val2|val3|valN END-OF-DATA TIMEFINISHED=Mon Apr 21 20:28:55 EDT 2014 END-OF-FILE 我想找出起始数据和结束数据之间的行数。最初,我必须为一个文件执行此操作,所以我只使用 V_ROWCOUNT=`w

以下是我的源文件的模式:

Col1
Col2
col3
colN
START-OF-DATA
val1|val2|val3|valN
val1|val2|val3|valN
val1|val2|val3|valN
val1|val2|val3|valN
END-OF-DATA
TIMEFINISHED=Mon Apr 21 20:28:55 EDT 2014
END-OF-FILE
我想找出起始数据和结束数据之间的行数。最初,我必须为一个文件执行此操作,所以我只使用

V_ROWCOUNT=`wc -l ${V_LOC}/${V_FILENM} | awk -F" " '{print ($1-1)}'`
然后减去非数据行的静态行数。现在我要做的是泛化,输入文件中唯一常见的是起始数据和结束数据。所以我想找出这两个标签之间的行数

你能告诉我怎样才能做到吗

谢谢

它的作用是:

grep表示结束数据,包括行号 产出10:结束数据 剪切输出,以:分隔,获取字段1 产出10 对于起始数据,重复上述步骤 使用echo将其构建到10-5中 将其导入bc basic计算器进行评估
这里有一种使用awk的方法:

rowcount=$(awk '/END-OF-DATA/{print NR-start; exit} /START-OF-DATA/{start=NR+1}' "$v_loc/$v_filenm")
这里是相同的,但是使用起始数据和结束数据作为变量,而不是将它们硬编码到awk脚本中:

start=START-OF-DATA end=END-OF-DATA
rowcount=$(awk -v start="$start" -v end="$end" '$0 ~ end { print NR - s; exit } $0 ~ start { s = NR + 1 }' "$v_loc/$v_filenm")
另一方面,您应该避免在内部使用大写变量,因为您可能会覆盖特殊的shell变量和环境变量


当变量扩展用作参数时,最好始终引用变量扩展,以避免在结果上出现不必要的分词和路径名扩展。

此语句用于:

set -- $(egrep -n 'START-OF-DATA|END-OF-DATA' | cut -d ':' -f1 ); expr $2 - $1

下面是另一个更具描述性的awk示例:

awk '
BEGIN { 
    begincounting = 0; 
    stopcounting = 0; 
    lines = 0; 
} 
{ 
    if ($1=="START-OF-DATA") { begincounting = 1; } 
    if ($1=="END-OF-DATA") { stopcounting = 1; } 
    if (begincounting==1 && stopcounting==0) { lines++; } 
} 
END {
    print "Total lines: "lines-1
}' test.txt
解释

开始{…}是我们放置一些变量或标志的地方。 接下来是身体。 如果我们注意到第一列是START-OF-DATA,那么我们将标志begincounting设置为1 如果注意到第一列是结束数据,我们将标志stopcounting设置为1 每当我们注意到设置了begincounting但未设置stopcounting时,我们都会增加变量行数 在读取信息的最后,我们打印出行数减去1 为什么是负1?请记住,begincounting标志会导致在找到起始数据后立即增加行数。这意味着,包含起始数据的行也被计算在内 希望这对将来的人有所帮助。

还有一个技巧:

$ n=$(( $(sed -n '/START-OF-DATA/,/END-OF-DATA/p' file | wc -l) - 2 ))
$ echo $n
4

谢谢盖尔哈的回答和建议。
$ n=$(( $(sed -n '/START-OF-DATA/,/END-OF-DATA/p' file | wc -l) - 2 ))
$ echo $n
4