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

awk:在单个文件中查找无序数据,awk,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.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等奇数


注意,这里所有的数字都是以十六进制表示的。0000001a.0000000b是十六进制数字,表示8digithExadcimal.8digithExadcimal。

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

你可以试试这一行:

awk -F. 'NR>1 && $1-a==0 && $2-b!=1{print}{a=$1;b=$2}' file
根据您的示例数据,此短线输出:

00000001.00000006
00000001.00000010

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

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

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
你可以试试这一行:

awk -F. 'NR>1 && $1-a==0 && $2-b!=1{print}{a=$1;b=$2}' file
根据您的示例数据,此短线输出:

00000001.00000006
00000001.00000010
您可以使用真实数据进行测试,并报告结果。我希望这就是你想要的。

awk'{print(NR>1&&!($1-a)=“1e-08”| |($1-a)=“1”)?$1“<无序”:$1;a=$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
1.00000001 1.00000002 1.00000003 1.00000004 00000001.00000006<无序 00000001.00000010<无序 2.00000001 2.00000002 2.00000003 2.00000004 0000000b.00000001<无序
awk'{print(NR>1&&!($1-a)=“1e-08”| |($1-a)=“1”)?$1“<无序”:$1;a=$1}”
1.00000001
1.00000002
1.00000003
1.00000004
00000001.00000006<无序
00000001.00000010<无序
2.00000001
2.00000002
2.00000003
2.00000004
0000000b.00000001<无序

这里有一种方法可以使用
awk

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

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001

EDIT1:

结果:

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001

EDIT2:

字符串比较:

awk -F. '$1 != x; { x = $1 }' file 
awk -F. 'strtonum("0x" $1) != x; { x = strtonum("0x" $1) }' file
十六进制比较:

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

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001

这里有一种使用awk的方法:

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

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001

EDIT1:

结果:

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001

EDIT2:

字符串比较:

awk -F. '$1 != x; { x = $1 }' file 
awk -F. 'strtonum("0x" $1) != x; { x = strtonum("0x" $1) }' file
十六进制比较:

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

00000001.00000006
00000001.00000010
00000001.00000006
00000001.00000010
00000001.00000001
00000002.00000001
0000000b.00000001
还有一点:

awk -F. 'p!=$1{p=$1; v=$2; next} v+1!=v=$2' file
还有一点:

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


00000002.00000001也坏了怎么样?前一个是
00000001.00000010
或者只有最后一个数字是有效的?这里不认为00000002.00000001有问题,因为它的第一个值是00000002而不是00000001。还有10个重复的行,如
001.001
,所有10行都是有序的?awk-F“{a=$1;b=$2;getline;c=$1;d=$2;if(c==a&&d!=(b++)print;}”'上面的文件不起作用下面有两个答案,试试看。
00000002.00000001
,也有问题吗?前一个是
00000001.00000010
或者只有最后一个数字是有效的?这里不认为00000002.00000001有问题,因为它的第一个值是00000002而不是00000001。还有10个重复的行,如
001.001
,所有10行都是有序的?awk-F“{a=$1;b=$2;getline;c=$1;d=$2;if(c==a&&d!=(b++)print;}”“上面的文件不起作用下面有两个答案,试试看。这不是顺序问题这是下一个序列的开始
00000002.00000005
00000002.00000010
都不见了,所以
0000000b.00000001
是顺序问题吗?对不起,我想我没有清楚地回答这个问题。”。假设a.1,然后a.2,然后a.5,这意味着a.5出现故障。这里的比较是相对于以前的值和a。或者说a.b b b应该相对于a排序。这不是顺序问题这是下一个序列的开始
00000002.00000005
00000002.00000010
缺失,所以
0000000b.00000001
是顺序问题吗?对不起,我想我没有清楚地回答这个问题。假设a.1,然后a.2,然后a.5,这意味着a.5出现故障。这里的比较是相对于以前的值和a。或者说a.b b b应该相对于a排序。如果有更多的第一个字段在前一行之后以不同的字母结束,而不是以数字结束(因为
$1-a==0
将保持为真。)注意,这里所有字段都被视为以十六进制表示的数字。例如a.b所以a和b都是十六进制数,并且都是8位的。如果有更多的第一个字段在前一行之后以不同的字母结束,而不是以数字结束(因为
$1-a==0
将为真…)注意,这里所有的数字都是以十六进制表示的。所以a和b都是十六进制数,而且都是8位数字。上面的糟糕消息不起作用。注意,这里所有的数字都是以十六进制表示的。所以a和b是十六进制的numbers@Omprakash:您需要
GNU awk
来处理十六进制。请参阅
strtonum()
函数。我马上更新我的答案。谢谢,它很管用。但在m/c中,我有旧的awk版本得到错误。awk:调用未定义的函数strtonum输入记录编号1,文件sortfile源代码行编号1,不使用strtonum我们可以做到吗?@Omprakash:是的,您需要在该框上使用
gawk
。否则,如果要使用
awk
,则需要编写自己的函数来模拟
strtonum()
。但是安装
gawk
可能更容易。好运。如何从上面的文件打印开始序列。输出应为:00000001.00000001 00000002.00000001 0000000b.00000001表示在上述模式a.1、a.2、a.3、b.1中,当“a”更改为新的时,比如说“b”,则该行应打印在上面不工作的操作。注意,这里所有的数字都是以十六进制表示的。所以a和b是十六进制的numbers@Omprakash:您需要
GNU awk
来处理十六进制。参见
s