Bash脚本(awk-sed-grep)检查下一行中的数字是否比前一行多1

时间:2017-12-06 09:09:16

标签: linux bash shell awk sed

我有一个文件:

_

我想使用Cat |来阅读此文件grep awk。 并且希望能够使用这些命令的组合来运行命令,以检查“值”部分中的每个数字是否在每个下一行中增加1。 如果在任何情况下都没有遵循,我希望能够看到这一点。

直到现在:我被困在: $ Cat FileName | awk -F“=”'{print $ 4}'

由于

4 个答案:

答案 0 :(得分:1)

Perl解决方案:

perl -ne 'next unless /value = ([0-9]+)/;
          print "$.: $_" if 1 + $value != $1;
          $value = $1' -- file.name
  • -n逐行读取输入行
  • 如果没有要检查的值,
  • next会跳过处理该行。
  • $value保留上一行的值。如果捕获的值不等于旧的加1,则会打印行号($.)和行($_)。

答案 1 :(得分:1)

Awk 解决方案:

示例input.txt

Time= 12:40:41, value = 1, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 2, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 3, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 5, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 6, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 7, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 9, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 10, data=2, data2=4,timeEnter=12:34:34
awk 'v && ($5-1)!=v{ printf "value %d is not followed by %d\n",v,v+1 }{ v=$5+0 }' input.txt
  • v=$5+0 - 捕获当前(作为数字)
  • v && ($5-1)!=v - 如果当前号码$5不是 next (增加 1 )相对于前一个v(等效条件为v && $5+0!=v+1

输出:

value 3 is not followed by 4
value 7 is not followed by 8

答案 2 :(得分:1)

考虑输入文件so.txt具有以下内容:

Time= 12:40:41, value = 1, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 2, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 3, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 4, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 7, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 8, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 9, data=2, data2=4,timeEnter=12:34:34
Time= 12:40:41, value = 10, data=2, data2=4,timeEnter=12:34:34

这是一个可能的解决方案:

cat so.txt | awk {'print $5'} | tr -d , | awk '$1!=p+1{print "values from "p+1" to "$1-1" are missing"}{p=$1}'

这将输出:

values from 5 to 6 are missing

如果值字段中没有间隙,则该命令不会输出任何内容。

这是如何运作的?

该命令可以打破为:

  • cat so.txt将在stdout上输出文件内容
  • awk {'print $5'}将打印第5列(值字段),
  • tr -d ,删除逗号分隔符

最终的awk表达式有:

  • $1是当前输入行的第一列
  • p是最后一行的前一个值
  • 所以($1!=p+1)是一个条件:如果$1与之前的值+1不同,那么:
  • 此部分已执行:{print "values from "p+1" to "$1-1" are missing"}:打印上一个值+1,第一列+1缺失
  • 每行执行
  • {p=$1}p已分配给当前第1列。

答案 3 :(得分:0)

您可以使用此function [y] = blah(x) y = (x^3) - x + 8; end

fplot('blah', [0 100])

<强>输入:

awk

<强>输出:

awk -F '[ ,]' 'NR==1{p=$6;next} $6!=p+1{print "Mismatched line no:"NR} {p=$6}' file