2010-08-09 8 views
5

Ho un file con i record che sono di forma:ricerca awk su più campi di un file di registrazione multilinea

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 

Ciò si presta ad analisi tramite awk usando qualcosa come: awk 'BEGIN {FS = "\ n"; RS = ""} /country:.*MO/ {print $ 0} '

La mia domanda è: come utilizzare awk per cercare i record in 2 campi separati? Ad esempio, desidero solo stampare i record che hanno un paese di MO E chi registra la prima linea è SMS-MO-FSM?

risposta

4

se è stato impostato FS = "\ n" e RS = "", il primo campo $ 1 sarà SMS-MO-FSM. Pertanto il codice awk è

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

Controllare con le corrispondenze di espressioni regolari indesiderate (come 'paese: SMO'). Vorrei usare il confronto delle stringhe ogni volta che è possibile e ancorare tutte le regex. – schot

+0

grazie, ma mi chiedo se potresti rispondere (probabilmente molto semplice) oltre all'ultima domanda. Vorrei stampare il risultato su una riga (per piping in sort | uniq)> Ho eseguito il tuo codice e ha funzionato benissimo (grazie) ma quando ho impostato OFS su "" (spazio) i campi del record sono ancora usciti su diverse linee. Che cosa sto facendo di sbagliato? Ecco il mio codice: awk 'BEGIN {FS = "\ n"; RS = ""; OFS = "";} $ 2 ~/paese: MO $/&& $ 1 ~/SMS-MO-FSM/{stampa $ 0} 'testFile.txt – adaptive

+0

quando si esegue il piping per ordinare, è necessario newlines .. non so come rispondi alla tua domanda dal momento che non fornisci informazioni sufficienti sui tuoi dati. prova l'impostazione OFS = "\ n" e vedi. – ghostdog74

3

(che inserisco questo come una risposta separata invece di un commento di risposta per la formattazione meglio)

Per quanto riguarda la tua seconda osservazione sulla stampa un record su una sola riga: quando si non modificare i record OFS e ORS non hanno alcun effetto. Solo quando si modifica $0 o uno dei campi awk verrà ricalcolato NF e ricostruito $0 in base a $1 OFS $2 OFS ... $NF ORS. È possibile forzare questa ricostruzione in questo modo:

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

brillante. grazie. – adaptive

Problemi correlati