2017-01-03 5 views
0

Meine Datei sieht aus wieSpiel mutiple Muster awk Befehl

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

Ich möchte Dateien sehen, die 117 in der 24. Feld und 2001 in der 6. Feld enthält

Ich bin mit

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

aber als 24. Feld kann mehr als 1 Wert getrennt durch Komma enthalten Ich bekomme nicht das richtige Ergebnis

+0

Hat der '117' zu Beginn des 24. Feld sein oder es kann jede beliebige Position und noch übereinstimmen, z.B. sollte '115,117,40' übereinstimmen? –

+0

es kann an jeder Position sein – Prafull

+0

Dann die Antwort, die Sie akzeptiert haben, funktioniert nicht für Sie als das erste Skript wird nur auf die erste Position, während das zweite Skript findet falsche Übereinstimmungen in jeder Position. –

Antwort

2

Oder nutzen GNU awk, split Funktion auf der Säule mit , de-Limiter, die Worte zu extrahieren und eine Überprüfung auf diesem Wert

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

zu tun Wenn das Element überall in der Spalte auftreten kann, nur ein ~ regex Übereinstimmung wäre ausreichend.

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

Für eine noch strengere RegEx-Übereinstimmung verweisen wir auf James Brown's answer.

+0

es ist nicht notwendig, dass 117 wird erste Nummer sein – Prafull

+0

@ Prafull: Verweise mein Update, das dein Problem lösen sollte – Inian

+0

DANKE, ES FUNKTIONIERT !!!! :) – Prafull

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

$6 gleich "2001" (verwenden Sie nicht nur 2001 weil falls Sie für 0 waren auf der Suche, $6==0 den impliziten Druck scheitern würde) und $25 enthält genau 117 (vorausgegangen und gefolgt von Start-of-string^ oder (|) Ende der Zeichenfolge oder Komma , (Sie könnten nur für den Fall in den Raum werfen)).

Testen der letzte Teil:

$ 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

'++' für die RegEx nur – Inian

+1

@Inian Anscheinend '/ [, ^] /' und solche funktionieren nicht ... –

+1

Enthalten eine Referenz auf Ihre Antwort in meiner! – Inian

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

2001 117 
Verwandte Themen