2014-11-20 40 views
0

我有千行的文本文件搜索在AWK多種模式

:ABC:xyz:1234:200:some text:xxx:yyyy:11818:AAA:BBB 
:ABC:xyz:6789:200:some text:xxx:yyyy:203450:AAA:BBB 
:EFG:xyz:11818:200:some text:xxx:yyyy:154678:AAA:BBB 
:HIJ:xyz:203450:200:some text:xxx:yyyy:154678:AAA:BBB 
:KLM:xyz:7777:200:some text:xxx:yyyy:11818:AAA:BBB 
..... 
.... 
:DEL:xyz:1234:200:some text:xxx:yyyy:203450:AAA:BBB 

我需要找到即O/P的第九列出現了多次應顯示

:ABC:xyz:1234:200:some text:xxx:yyyy:11818:AAA:BBB 
:KLM:xyz:7777:200:some text:xxx:yyyy:11818:AAA:BBB 

:ABC:xyz:6789:200:some text:xxx:yyyy:203450:AAA:BBB 
:DEL:xyz:1234:200:some text:xxx:yyyy:203450:AAA:BBB 

我試過了:

awk -F ":" '$9 > 2 {split($0,a,":"); print $0}' 

這打印出所有的記錄。

+0

你的第九場似乎是「AAA的。它們從1開始編號。該程序執行期望的操作... $ 0表示整行。有時將模式編寫爲2.0 <(0.0 + $ 9)非常有用,因此不會將其作爲字符串比較 – user1666959 2014-11-20 19:28:32

+0

@ user1666959您忘記':'前有一個字段,所以第九個字段是數字。 – Jotne 2014-11-20 19:32:05

+0

你說得對。不影響評論的其餘部分。 awk把它當作字符串比較..並且OP的代碼很混亂,分割是不相關的(即沒有發生'a')...所以我只是投入了想法。 – user1666959 2014-11-20 19:39:19

回答

1

這應該這樣做純粹AWK:

awk -F":" '{if(s[$9]){ print } else if(f[$9]){ print f[$9]; s[$9]=1; print }; f[$9]=$0 }' 

說明:

  • 「f」數組存儲至少出現o的第9列的值NCE。
  • 「s」數組存儲兩次或更多次出現的第9列的值。
  • 如果第9列之前發生過,則打印第一個匹配項和此行。
  • 如果第9列出現兩次或更多次,則打印此行。
+0

感謝您的替代解決方案和解釋。 – Aires69 2014-11-20 20:03:33

3
awk -F':' 'NR==FNR{cnt[$9]++;next} cnt[$9]>1' file file 

,或者如果你不想來解析兩次文件:

awk -F':' 'cnt[$9]++{printf "%s", prev[$9]; delete prev[$9]; print; next} {prev[$9]=$0 ORS}' file 
+1

簡單而美麗:)。你可以在某些UNIX shell中將'file file'寫爲'file {,}' – Jotne 2014-11-20 19:47:49

+0

@Jotne yes,但是idk使用的是什麼環境。 – 2014-11-20 19:48:24

+1

@Ed謝謝..作品gr8。 – Aires69 2014-11-20 20:02:45

0

這裏是另一個awk

awk -F: '{++a[$9];b[NR]=$0} END {for (i=1;i<=NR;i++) {split(b[i],c,":");if (a[c[9]]>1) print b[i]}}' file