2010-08-09 10 views
5

Mam plik z rekordami, które są w postaci:wyszukiwania awk na wielu polach pliku nagrania wielu linii

SMS-MT-FSM-DEL-REP 
country: IN 
1280363645.979354_PFS_1_1887728354 

SMS-MT-FSM-DEL-REP 
country: IN 
1280363645.729309_PFS_1_1084296392 

SMS-MO-FSM 
country: IR 
1280105721.484103_PFM_1_1187616097 

SMS-MO-FSM 
country: MO 
1280105721.461090_PFM_1_882824215 

ten nadaje się do analizowania przez awk przy użyciu coś jak: awk „BEGIN {FS = "\ n"; RS = ""} /country:.*MO/ {print $ 0} '

Moje pytanie brzmi: jak używać awk do wyszukiwania rekordów na 2 oddzielnych polach? Na przykład chcę wydrukować tylko rekordy, które mają kraj ORAZ kto nagrywa pierwszą linię to SMS-MO-FSM?

Odpowiedz

4

jeśli ustawiłeś FS = "\ n", a RS = "", to pierwszym polem $ 1 będzie SMS-MO-FSM. Dlatego kod awk jest

awk 'BEGIN{FS="\n"; RS=""} $2~/country.*MO/ && $1~/SMS-MO-FSM/ ' file 
+0

Uważaj na niechciane dopasowania regex (np. 'Kraj: SMO'). Gdyby było to możliwe, użyłbym porównania łańcuchów i zakotwiczenia wszystkich wyrażeń regularnych. – schot

+0

dziękuję, ale zastanawiam się, czy możesz odpowiedzieć (prawdopodobnie bardzo prosty) dodatek do ostatniego pytania. Chciałbym wydrukować wynik w jednym wierszu (dla pipingu do sortowania | uniq)> Uruchomiłem twój kod i działało świetnie (dziękuję), ale kiedy ustawiłem OFS na "" (spacja) pola rekordu wciąż pojawiały się na różnych liniach. Co ja robię źle? Oto mój kod: awk 'BEGIN {FS = "\ n"; RS = ""; OFS = "";} 2 $/kraj: MO $/&& $ 1 ~/SMS-MO-FSM/{print $ 0} 'testFile.txt – adaptive

+0

podczas pipowania do sortowania, potrzebujesz nowych linii .. Nie wiem jak odpowiedz na twoje pytanie, ponieważ nie podajesz wystarczających informacji na temat swoich danych. spróbuj ustawić OFS = "\ n" i zobacz. – ghostdog74

3

(ja zakładać to jako oddzielny odpowiedź zamiast post komentarz do lepszego formatowania)

dotyczącego drugiego uwagą na temat drukowania rekord w jednej linii: kiedy nie modyfikuj swoich rekordów OFS i ORS nie mają żadnego efektu. Tylko po zmianie $0 lub jednemu z pól zostanie przeliczony NF i zrekonstruuj $0 na podstawie $1 OFS $2 OFS ... $NF ORS. Możesz wymusić rekonstrukcję w następujący sposób:

BEGIN { 
    FS = "\n" 
    RS = "" 
    OFS = ";"  # Or another delimiter that does not appear in your data 
    ORS = "\n" 
} 
$2 ~ /^[ \t]*country:[ \t]*MO[ \t]*$/ && $1 ~ /^[ \t]*SMS-MO-FSM[ \t]*$ { 
    $1 = $1 "" # This forces the reconstruction 
    print 
} 
+0

genialny. Dziękuję Ci. – adaptive

Powiązane problemy