0

对于下面的示例文件内容

00000001.00000001
00000001.00000002
00000001.00000003
00000001.00000004
00000001.00000006
00000001.00000010
00000002.00000001
00000002.00000002
00000002.00000003
00000002.00000004
0000000b.00000001

需要查找乱序数据。这里的乱序含义是在 00000001.00000004 之后,下一个应该是 00000001.00000005 而不是 00000001.00000006 如上所述。00000001.00000010 也是一个错误的输入,因为在 00000001.00000006 之后,下一个 00000001.00000007 应该出现。

使用 awk 我们可以从上面的文件中打印奇怪的喜欢 00000001.00000006 和 00000001.00000010。

请注意,这里所有的都被认为是十六进制的数字。EG 0000001a.0000000b 是十六进制数字,表示 8digithexadecimal.8digithexadecimal。

4

4 回答 4

1

我希望我能正确理解你的问题。

你可以试试这个:

awk -F. 'NR>1 && $1-a==0 && $2-b!=1{print}{a=$1;b=$2}' file

给定您的示例数据,这条短线输出:

00000001.00000006
00000001.00000010

您可以使用真实数据进行测试,并报告结果。我希望这是你正在寻找的。

于 2013-03-01T13:14:41.217 回答
1
awk '{print (NR>1&&!(($1-a)=="1e-08"||($1-a)=="1"))?$1" < OutOfOrder":$1;a=$1}'
00000001.00000001
00000001.00000002
00000001.00000003
00000001.00000004
00000001.00000006 < OutOfOrder
00000001.00000010 < OutOfOrder
00000002.00000001
00000002.00000002
00000002.00000003
00000002.00000004
0000000b.00000001 < OutOfOrder
于 2013-03-01T13:14:43.323 回答
1

这是一种使用方法awk

awk -F. 'NR > 1 && $1==a && $2 + 0 != b + 1; { a=$1; b=$2 + 0 }' file

结果:

00000001.00000006
00000001.00000010

编辑1:

awk -F. 'NR > 1 && strtonum("0x" $1) == a && strtonum("0x" $2) != b + 1; { a=strtonum("0x" $1); b=strtonum("0x" $2) }' file

结果:

00000001.00000006
00000001.00000010

编辑2:

字符串比较:

awk -F. '$1 != x; { x = $1 }' file 

十六进制比较:

awk -F. 'strtonum("0x" $1) != x; { x = strtonum("0x" $1) }' file

结果:

00000001.00000001
00000002.00000001
0000000b.00000001
于 2013-03-01T13:21:51.580 回答
1

多一个:

awk -F. 'p!=$1{p=$1; v=$2; next} v+1!=v=$2' file
于 2013-03-01T13:53:52.747 回答