我有一个大型日志文件,其中包含格式为
的行id_number message_type
以下是日志文件的示例,其中所有行都按预期顺序显示
1 A
2 A
1 B
1 C
2 B
2 C
但是,并非所有行都出现在我的日志文件中的预期顺序中,并且我想获得未按预期顺序出现的所有ID号的列表。对于以下文件
1 A
2 A
1 C
1 B
2 B
2 C
我想得到一个输出,表明id号1的行没有出现在预期的顺序中。如何使用grep
,sed
和awk
?
答案 0 :(得分:1)
我只能在我的iPad上无法测试这个,但我可以告诉你如何使用awk
来解决这个问题,因为没有其他人在回答......
这样的事情:
awk 'BEGIN{for(i=0;i<10000;i++)expected[i]=ord("A")}
{if(expected[$1]!=ord($2))
print "Out of order at line ", NR, $0;
expected[i]=ord($2)+1
}' yourFile
您需要粘贴here的ord()
功能。
基本上,概念是初始化一个名为expected[]
的数组,该数组跟踪每个id
所期望的下一个消息类型,然后,在读取每一行时,检查它是下一个预期值
答案 1 :(得分:1)
这对我有用:
awk -v "a=ABC" 'substr(a, b[$1]++ + 1, 1) != $2 {print $1}' logfile
运行此操作时,将打印每个无序行的ID号。如果没有乱序线,则不打印任何内容。
-v "a=ABC"
这将变量a
定义为具有预期顺序的字符列表。
substr(a, b[$1]++ + 1, 1) != $2 {print $1}
对于每个ID号,数组b
会跟踪我们的位置。最初,b
对于所有ID都为零。使用此初始值(即b[$1]==0
),表达式substr(a, b[$1] + 1, 1)
将返回A
,这是我们的第一个预期输出。因此,条件substr(a, b[$1] + 1, 1) != $2
检查来自substr
函数的预期输出是否与第二个字段$2
中显示的实际输出不同。如果确实不同,则会打印ID值$1
。
计算substr
表达式后,表达式++
中的尾随b[$1]++
会将b[$1]
的值增加1,以使b[$1]
的值增加准备好在下次遇到ID $1
时。
每次遇到无序行时,上面都会打印一个ID号。如果您只想打印一次而不是多次打印坏ID,请使用:
awk -v "a=ABC" 'substr(a, b[$1]++ + 1, 1) != $2 {bad[$1]++} END{for (n in bad) print n}' logfile
答案 2 :(得分:1)
仅限批次(最后一种排序不是强制性的)
sort -k1n YourFile | tee file1 | sort -k2 > file2 && comm -23 file1 file2 | sort