Muchas personas han sido muy útiles mediante la publicación de la siguiente solución para AWK ing entrada múltiples archivos a la vez:

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1

Esto funciona bien, pero me preguntaba si alguien podría explicarme por qué? Me parece que el AWK sintaxis un poco difícil de conseguir la caída de, y estaba esperando a alguien no le importa romper el fragmento de código de abajo para mí.

InformationsquelleAutor jkovba | 2013-02-20

3 Comentarios

  1. 64
    awk 'FNR==NR{a[$1]=$2 FS $3;next}

    aquí nos encargamos de la 1ª entrada (archivo2). decir, FS es el espacio, podemos construir una matriz(a) hasta, índice de la columna 1, el valor es column2 " " column3 la FNR==NR and next medios, esta parte de los códigos de trabajo sólo para archivo2. podría el hombre gawk comprobar lo que están NR y FNR

    { print $0, a[$1]}' file2 file1

    Cuando NR != FNR es tiempo de proceso de 2º de entrada, el archivo1. aquí es la impresión de la línea de archivo1, y tomar column1 como índice, buscar el valor en la matriz(a) de impresión. en otra palabra, file1 y file2 están unidos por column1 en ambos archivos.

    para NR y FNR, en breve,

    1st input has 5 lines
    2nd input has 10 lines,
    
    NR would be 1,2,3...15
    FNR would be 1...5 then 1...10

    ver el truco de FNR==NR de verificación.

    • Kent, excelente explicación, muchas gracias. No me di cuenta de que el ‘FNR==NR’ fue la formación de un tipo de ‘if’. Esto es exactamente lo que necesito para poder seguir adelante. Muchas gracias por tomarse el tiempo de ayudar!
  2. 12

    He encontrado esta pregunta/respuesta en Google y parece estar refiriéndose a un muy específicos conjunto de datos se encuentra en otra pregunta (Cómo combinar dos archivos usando AWK?). Lo que sigue es la respuesta que estaba buscando (y que creo que la mayoría de la gente sería), es decir, simplemente para concatenar cada línea a partir de dos diferentes archivos usando AWK. A pesar de que probablemente podría utilizar algunas utilidades de UNIX como unirse o pegar, AWK es, obviamente, mucho más potente y flexible, si el resultado es diferente, mediante el uso de si declaraciones, o la alteración de la OFS (que puede ser más difícil de hacer en función de la utilidad; ver a continuación) por ejemplo, la alteración de la salida de una forma mucho más expresivos de la forma (una consideración importante para los creadores de scripts de shell.)

    Por simple línea-por-línea de concatenación:

    awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2

    Esto simula la función de un array indexado (AWK sólo ha arrays asociativos) mediante el uso implícito de conversión de tipo. Es relativamente expresivo y fácil de entender.

    El uso de dos archivos llamados test1 y test2 con las siguientes líneas:

    prueba1:

    line one
    line two
    line three

    test2:

    line four
    line five
    line six

    Me sale este resultado:

    line one line four
    line two line five
    line three line six

    Dependiendo de cómo desea unirse entre los valores de las columnas en el resultado, usted puede elegir la salida apropiada separador de campo. He aquí un ejemplo con puntos suspensivos (…) la separación de las columnas:

    awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2

    Dando este resultado:

    line one...line four
    line two...line five
    line three...line six

    Espero al menos que este inspira a todos a aprovechar el poder de AWK!

    • Si el objetivo es sólo para unirse a las columnas de al lado, que es mucho más simple de usar paste comando.
  3. 3

    Hace un tiempo me encontré en una muy buena solución para manejar múltiples archivos a la vez. La forma es guardar en la memoria los archivos en AWK matrices usando el método:

    FILENAME==ARGV[1] {  file2array[FNR] = $0 ; next }
    FILENAME==ARGV[2] {  file1array[FNR] = $0 ; next }

    Para el posterior tratamiento de los datos, es mejor guardar el número de líneas, por lo que:

    FILENAME==ARGV[1] {  file2array[FNR] = $0 ; f2rows = FNR ; next }
    FILENAME==ARGV[2] {  file1array[FNR] = $0 ; f1rows = FNR ; next }

    f2rows y f1rows mantendrá la posición de la última fila.

    Tiene más código, pero si quieres más complejo el tratamiento de los datos, creo que es el mejor enfoque. Además, los enfoques anteriores tratados de las entradas de forma secuencial, por lo que si usted necesita hacer algunos cálculos que dependen de los datos de ambos archivos al mismo tiempo usted no será capaz de hacerlo, y con este enfoque se puede hacer de todo con ambos archivos.

    • Mientras que las otras respuestas son grandes para los dos archivos (o más si es sólo el primer archivo que necesita un tratamiento especial) — upvoted esto ya que se puede utilizar con cualquier número de archivos.

Dejar respuesta

Please enter your comment!
Please enter your name here