我正在寻找让脚本执行以下操作的想法:
我有一个文本文件,例如。其中包含类似文字的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。
答案 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打印任何不符合此模式的行。