2010-08-09 10 views
5

que tengo un archivo con registros que son de la forma:búsqueda awk en múltiples campos de un archivo de registro de múltiples líneas

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 

Esto se presta a analizar a través de awk usando algo como: awk 'BEGIN {FS = "\ n"; RS = ""} /country:.*MO/ {print $ 0} '

Mi pregunta es ¿cómo uso awk para buscar los registros en 2 campos separados? Por ejemplo, solo quiero imprimir registros que tengan un país de MO Y ¿quién registra la primera línea es SMS-MO-FSM?

Respuesta

4

si ha configurado FS = "\ n", y RS = "", entonces el primer campo $ 1 sería SMS-MO-FSM. Por lo tanto su código awk es

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

Tenga cuidado con las coincidencias de expresiones regulares no deseadas (como 'country: SMO'). Usaría una comparación de cadenas siempre que sea posible y anclaré todas las expresiones regulares. – schot

+0

gracias, pero me pregunto si podría responder (probablemente muy simple) a la última pregunta. Me gustaría imprimir el resultado en una línea (para canalizar en sort | uniq)> Ejecuté su código y funcionó muy bien (gracias) pero cuando configuré OFS en "" (espacio) los campos del registro aún salieron en diferentes líneas. ¿Qué estoy haciendo mal? Aquí está mi código: awk 'BEGIN {FS = "\ n"; RS = ""; OFS = "";} $ 2 ~/país: MO $/&& $ 1 ~/SMS-MO-FSM/{print $ 0} 'testFile.txt – adaptive

+0

cuando se hace la tubería para ordenar, necesita nuevas líneas ... no sé cómo responda su pregunta ya que no proporciona suficiente información sobre sus datos. intente configurar OFS = "\ n" y vea. – ghostdog74

3

(he puesto esto como una respuesta independiente en lugar de una respuesta comentario para mejor formato)

En cuanto a su segunda observación sobre la impresión de un registro en una sola línea: Cuando no modifique sus registros OFS y ORS no tienen ningún efecto. Solo cuando cambie $0 o uno de los campos awk se recalculará NF y se reconstruirá $0 según $1 OFS $2 OFS ... $NF ORS. Puede forzar esta reconstrucción de esta manera:

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. gracias. – adaptive

Cuestiones relacionadas