2017-01-03 17 views
0

我的文件看起來像比賽多發性模式使用awk命令

10.183.227.46|242066391737|73633662;244809|com.com|com.com|2001|CCA-I|0|[29/Dec/2016:00:00:40]|26|RULE_31893406,RULE_31893405,RULE_416241598|4106,4105,4000|2006,2005,5000|0|0|0|0|2621440|3000|-|-|1003:0,1013:0,1010:Home|244809|0|117,115,40|-|-| 

我希望看到包含在第24場1172001在第6場文件

我使用

awk -F "|" '{if($6==2001 && $24==117)print }' 29_DEC_2016.1 

但作爲第24場可以包含多個1值逗號分隔 我沒有得到正確的結果

+0

是否'117'必須在第24字段的開始,或者它可以是任何任意位置,並且仍然匹配,例如應該匹配115,117,40? –

+0

它可以在任何位置 – Prafull

+0

然後,您接受的答案不適用於您,因爲第一個腳本只會查看第一個位置,而第二個腳本會在任何位置查找錯誤匹配。 –

回答

2

或者使用GNU awksplit功能與,去限制列提取的話,做該值

awk -F "|" '{split($25,array1,","); if ($6 == "2001" && array1[1] == "117"){print} }' file 

檢查如果該元素可以在列的任何地方發生,只是一個~正則表達式匹配就足夠了。

awk -F "|" '$6 == "2001" && $25 ~ /117/' file 

請參閱此James Brown's answer以獲得更加嚴格的regEx匹配。

+0

沒有必要117將是第一個數字 – Prafull

+0

@Prafull:請參考我的更新應該能夠解決您的問題 – Inian

+0

謝謝,它工作! :) – Prafull

3
$ awk -F\| '$6=="2001" && $25 ~ /(^|,)117($|,)/' file 

$6等於"2001"(不要只使用2001因爲如果你正在尋找0$6==0會失敗隱含打印)和$25恰好包括117(preceeded和隨後啓動的串^或(|字符串尾部或逗號,(爲了以防萬一,您可以在空間中放置))。

測試後半部分:

$ cat foo 
117,2,3 # good 
1,117,3 # good 
1,2,117 # good 
1117,2,3 # bad 
1,1117,3 # bad 
1,2,1177 # bad 
$ awk '$1~/(^|,)117($|,)/' foo 
117,2,3 # good 
1,117,3 # good 
1,2,117 # good 
+1

++只爲regEx – Inian

+1

@Inian顯然'/ [,^] /'這樣不工作... –

+1

包括對你的答案在我的引用! – Inian

0
awk -F'[|,]' '{print $6,$(NF-5)}' file 

2001 117