2013-03-01 38 views
0

對於示例文件內容如下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是十六進制數字意思是8位十六進制數字8數字十六進制。

+0

怎麼樣'00000002.00000001',亂序呢?前一個是'00000001.00000010'還是隻有最後一個數字是重要的? – Kent 2013-03-01 13:01:18

+0

否00000002.00000001在這裏不被視爲無序,因爲它的第一個值是00000002而不是00000001. – Omprakash 2013-03-01 13:03:47

+0

還有10個重複的行像'001.001',所有10行都是爲了? – Kent 2013-03-01 13:06:18

回答

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 
+0

這也適用。 – Omprakash 2013-03-01 13:38:20

+0

糟糕以上無法正常工作。請注意,這裏將所有數字視爲十六進制數字。 EG a.b所以a和b是十六進制數字 – Omprakash 2013-03-04 09:39:47

+0

@Omprakash:您需要'GNU awk'來處理您的十六進制。參見'strtonum()'函數[這裏](http://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions)。我會在一分鐘內更新我的答案。 HTH。 – Steve 2013-03-04 11:10:36

1

我希望我能理解你的問題。

你可以嘗試這一個班輪:

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

給您的數據。例如,該短行輸出:

00000001.00000006 
00000001.00000010 

你可以與你的真實數據進行測試,並將結果報告。我希望這是你正在尋找的。

+0

這會在第一個字段以另一個字母而不是一個數字的上一行後以不同的字母結尾的情況下產生錯誤否定結果(因爲'$ 1-a == 0'然後會保持爲真。) – Scrutinizer 2013-03-01 14:01:18

+0

糟糕使用真實數據進行工作 – Omprakash 2013-03-01 14:11:21

+0

請注意,這裏將所有數據都視爲十六進制數字。 EG a.b所以a和b是十六進制數字 – Omprakash 2013-03-01 14:13:07

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 
+0

這不是故障這是下一個seq – Omprakash 2013-03-01 13:36:48

+0

'00000002.00000005'到'00000002.00000010'的開頭是否丟失,所以'0000000b.00000001'壞了? – 2013-03-01 13:43:49

+0

對不起,我想我沒有清楚地說過這個問題。 讓我們說a.1然後a.2然後a.5意味着a.5失靈。這裏的比較是相對於以前的值和a。或者說a.b b應該相對於a來命令。 – Omprakash 2013-03-01 14:09:37

1

還有一個:

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