El uso de la tubería en AWK

Lo que yo quiero es conseguir la inversión de la cadena de la línea actual, traté de usar el rev comando en el AWK, pero no puede obtener el resultado actual.

$ cat myfile.txt
abcde

$ cat myfile.txt | awk '{cmd="echo "$0"|rev"; cmd | getline result;  print "result="$result; close(cmd);}'
abcde

Quiero llegar edcba en la salida.

Sé que hay otras maneras de obtener la inversión de la cadena, como $ cat myfile.txt | exec 'rev'. El uso de AWK aquí es porque hay algunos otros procesos que hacer.

¿ Se me olvida algo?

InformationsquelleAutor Aidy | 2013-03-11

5 Kommentare

  1. 5

    La función del sistema permite al usuario ejecutar comandos del sistema operativo y, a continuación, volver a la awk programa. La función del sistema que se ejecuta el comando dado por la cadena de comando. Devuelve, como su valor, el estado devuelto por el comando que se ejecutó.

    $ cat file
    abcde
    
    $ rev file
    edcba
    
    $ awk '{system("echo "$0"|rev")}' file
    edcba
    
    # Or using a 'here string'
    $ awk '{system("rev<<<"$0)}' file
    edcba
    
    $ awk '{printf "Result: ";system("echo "$0"|rev")}' file
    Result: edcba
    
    # Or using a 'here string'
    $ awk '{printf "Result: ";system("rev<<<"$0)}' file
    Result: edcba
  2. 1

    Llamar a la rev comando awk es muy ineficiente, ya que se crea un sub-proceso para cada línea de procesado. Creo que se debe definir un rev función en awk:

    $ cat myfile.txt | awk 'function rev(str) {
        nstr = ""
        for(i = 1; i <= length(str); i++) {
          nstr = substr(str,i,1) nstr
        }
        return nstr
      }
      {print rev($0)}'
    edcba
  3. 0

    El único problema es con la instrucción print. Uso

    print "result=" result;

    (No $ en result)

    • Sí, funcionó después de quitar el signo $. ¿Por qué se obtiene el contenido del archivo cuando se utiliza $resultado en la impresión?
  4. 0

    ¿Por qué no

    awk '{print "result =",$0}' <(rev file)

    o si usted no está utilizando bash /ksh93 :

    rev file | awk '{print "result =",$0}'

    O si su awk soporta el vacío FS opción:

    awk '{res=x; for(i=NF; i>=1; i--) res=res $i; print res}' FS= file
    • Gracias por su respuesta, y todo funciona en mi Bash, y es bueno saber que se puede configurar de vacío delimitador en awk.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea