awk:在单个文件中查找乱序数据

时间:2013-03-01 12:51:06

标签: awk

对于

下面的示例文件内容
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 个答案:

答案 0 :(得分:1)

我希望我理解你的问题。

你可以试试这个班轮:

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

根据您的示例数据,此短线输出:

00000001.00000006
00000001.00000010

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

答案 1 :(得分: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

答案 2 :(得分:1)

这是使用awk的一种方式:

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

结果:

00000001.00000006
00000001.00000010

<强> EDIT1:

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

<强> EDIT2:

字符串比较:

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

十六进制比较:

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

结果:

00000001.00000001
00000002.00000001
0000000b.00000001

答案 3 :(得分:1)

还有一个:

awk -F. 'p!=$1{p=$1; v=$2; next} v+1!=v=$2' file