用于计算除#以外的部分中的行计

时间:2017-07-25 13:18:52

标签: linux bash

我正在寻找让脚本执行以下操作的想法:

我有一个文本文件,例如。其中包含类似文字的test.txt

#
# sectione 1
#
several
text
lines 
and so on
#
# sectione 2
#
more text
and more
#
and more
# ...
#
# sectione 3
#
more
more
more 
#
# sectione 4
#
...
...

我需要有可能只计算第2节中的行并排除以#

开头的行

在上面的例子中,脚本应该在最后显示一个带“3”的计数器 例如

# counter_script.sh test.txt 
# 3

这种可能性,我该怎么办? 我正在使用Debian Linux和bash shell。

4 个答案:

答案 0 :(得分:1)

您可以使用以下awk命令:

awk '/sectione/{f=$3==2?1:0}f&&!/^#/{c++}END{print c}' file

多行版本中的说明:

section2.awk:

/sectione/ {
    # Set f(ound) to 1 (true) if the number between 'sectione' is a 2
    # otherwise 0 (false)
    f=$3==2?1:0
}

# If f(ound) is true (1) and the line starts not with a #
# count it
f&&!/^#/{
    c++
}

# At the end of input print the c(ount)
END{
    print c
}

答案 1 :(得分:0)

以下代码仅查找(第2节)部分计数。请尝试以下操作并告诉我这是否有帮助。

awk '/sectione 3/{a=""}/sectione 2/{a=1;next} !/#/ && a{count++} END{print count}'   Input_file

EDIT1:现在再添加一个解决方案。

awk '/sectione 2/,/sectione 3/{count=$0!~/#/?++count:count} END{print count}'   Input_file

答案 2 :(得分:0)

还有一种方法:

sed -n '/# sectione 2/,/# sectione 3/{/^#/d;//!p;}' file | wc -l

/# sectione 2/,/# sectione 3/选择第2部分和第3部分之间的行

/^#/d删除以#

开头的行

//!p打印其余部分..

答案 3 :(得分:0)

case class TablaItems(registros: List[Dato])

implicit class TablaItemsOperations(tabla: TablaItems){
  def withData(reg: List[Dato]) = TablaItems(tabla.registos :: reg)
}

...


val tablaLibros = TablaItems(Registros1)
tablaLibros.registros.foreach(println)
println("----")
val tablaLibrosUpdated = tablaLibros.withData(Registros2)
tablaLibrosUpdated.registros.foreach(println)
println("----")
tablaLibrosUpdated.registros.sortBy(_.numeroDePaginas)

在第2部分和第3部分的模式匹配之间处理数据,在行的开头处为#,然后使用!p打印任何不符合此模式的行。