Estoy usando awk substr() para extraer una sub-cadena de la cadena.

Por ejemplo, si mi cadena se parece a esto:

qwertyuiop

Y quiero extraer (1-3) & (6-9) caracteres, yo uso este:

awk '{print (substr($1, 1, 3) substr($1, 6, 4))}'  
qweyui

¿Cómo puedo repetir un determinado resta varias veces?

Por ejemplo, quiero extraer (1-3) y aplicaciones de; (6-9)(6-9)(6-9) caracteres para obtener el resultado como este:

qweyuioyuioyuio

Por supuesto que puede utilizar un comando como este:

awk '{print (substr($1, 1, 3) substr($1, 6, 4) substr($1, 6, 4) substr($1, 6, 4))}'

Hay una forma más simple?

  • asignar el valor de la substr a una variable, a continuación, repita la impresión de la variable? La buena suerte.
InformationsquelleAutor PoGibas | 2013-02-11

4 Comentarios

  1. 3

    Siempre desea extraer no se solapan las subcadenas, puede utilizar la opción ancho de columna fijo de gawk:

    echo "qwertyuiop" | gawk -v FIELDWIDTHS="3 2 4" '{ print $1 $3 $3 $3 }'

    Definir 3 columnas. El primero es de 3 caracteres de ancho (este es el mismo como substr($1, 1, 3)). El segundo es de 2 caracteres de ancho (y vamos a ignorar). La 3ra es la segunda substring (substr($1, 6, 4)).

    La puede imprimir directamente los campos que se han definido.

    Ver https://www.gnu.org/software/gawk/manual/gawk.html#Constant-Size

    • Personalmente, creo que su primera cláusula es un interruptor. FIELDWIDTHS realmente sólo debería ser utilizado para el ancho fijo de procesamiento de datos.
    • Lo que es especialmente apropiado si los datos se realiza de ancho fijo campos… Si los datos a leer no es la superposición, esto es mejor que el uso de varios substr().
  2. 1

    Hay un delicioso post explicar las diferentes formas de la repetición de cadena en awk.

    Voy a citar los más evidentes:

    function rep1(s,n,      r) {
    # O(n) allocate/appends
    # 2 lines of code
    # This is the simplest possible solution that will work:
    # just repeatedly append the input string onto the value
    # that will be passed back, decrementing the input count
    # until it reaches zero.
            while (n-->0) r = r s;
            return r;
    }

    PS: La gran cantidad de espacio antes de parámetro de la función en awk indica que este parámetro se utiliza como variable local temporal.

  3. 1

    Sí. Usted puede simplemente guardar la subcadena a una variable, a continuación, vuelva a imprimir según sea necesario. No olvides poner un null OFS:

    awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

    Pruebas:

    echo "qwertyuiop" | awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

    Resultados:

    qweyuioyuioyuio

    Si necesita imprimir algo más de tres o cuatro veces, puede ser útil el uso de un for bucle:

    echo "qwertyuiop" | awk '{ for(i=1;i<=5;i++) x = x substr($1, 6, 4); print substr($1, 1, 3), x }' OFS=

    Resultados:

    qweyuioyuioyuioyuioyuio
  4. 0

    Esta es una de las soluciones a un problema (desordenado pero funciona).

     echo qwertyuiop | awk '{m=substr($1, 6, 4); {while (count++<3) string=string m; 
     print substr($1, 1, 3) string}}' 
    
     qweyuioyuioyuio

Dejar respuesta

Please enter your comment!
Please enter your name here