InglésFrancésAlemánItalianoPortuguésrusoEspañol

icono de página de OnWorks

mawk - Online en la nube

Ejecute mawk en el proveedor de alojamiento gratuito de OnWorks sobre Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS

Este es el comando mawk que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.

PROGRAMA:

NOMBRE


mawk - lenguaje de procesamiento de texto y escaneo de patrones

SINOPSIS


mawk [-W opción] [-F VALORAMOS] [-v var = valor] [-] 'texto del programa' [archivo ...]
mawk [-W opción] [-F VALORAMOS] [-v var = valor] [-f Archivo de programa] [--] [expediente ...]

DESCRIPCIÓN


mawk es un intérprete del lenguaje de programación AWK. El lenguaje AWK es útil para
manipulación de archivos de datos, recuperación y procesamiento de texto, y para la creación de prototipos y
experimentando con algoritmos. mawk es un Un nuevo awk lo que significa que implementa el lenguaje AWK
como se define en Aho, Kernighan y Weinberger, El AWK Programación Idioma, Addison-Wesley
Publishing, 1988 (en adelante, el libro AWK). mawk se ajusta a la Posix
1003.2 (borrador 11.3) definición del lenguaje AWK que contiene algunas características que no
descrito en el libro AWK, y mawk proporciona una pequeña cantidad de extensiones.

Un programa AWK es una secuencia de patrón {acción} pares y definiciones de funciones. Pequeño
los programas se ingresan en la línea de comando generalmente encerrados en '' para evitar el shell
interpretación. Los programas más largos se pueden leer desde un archivo con la opción -f. Datos
La entrada se lee de la lista de archivos en la línea de comando o de la entrada estándar cuando el
la lista esta vacía. La entrada se divide en registros según lo determinado por el separador de registros
variable, RS. Inicialmente, RS = "\ n" y los registros son sinónimos de líneas. Cada registro es
comparado con cada uno patrón y si coincide, el texto del programa para {acción} is
ejecutado.

OPCIONES


-F VALORAMOS establece el separador de campo, FS, a un VALORAMOS.

-f presentar El texto del programa se lee desde presentar en lugar de desde la línea de comandos. Múltiple
-f se permiten opciones.

-v var = valor asigna VALORAMOS para programar la variable var.

- indica el final inequívoco de las opciones.

Las opciones anteriores estarán disponibles con cualquier implementación de AWK compatible con Posix, y
Las opciones específicas de implementación están precedidas por -W. mawk proporciona seis:

-W versión mawk escribe su versión y derechos de autor en stdout y compila los límites para
stderr y sale 0.

-W dump escribe un ensamblador como una lista de la representación interna de la
programa a stdout y sale 0 (en compilación exitosa).

-W interactivo establece escrituras sin búfer en stdout y lecturas con búfer de línea desde stdin.
Los registros de stdin son líneas independientemente del valor de RS.

-W ejecutivo presentar El texto del programa se lee desde presentar y esta es la última opción. Útil en
sistemas que apoyan el #! Convención de "números mágicos" para ejecutables
scripts.

-W sprintf =número ajusta el tamaño de mawk's búfer sprintf interno para número bytes. Mas que
el uso poco frecuente de esta opción indica mawk debe recompilarse.

-W fuerzas posix_space mawk no considerar '\ n' como espacio.

Las formas cortas -W[vdiesp] son ​​reconocidos y en algunos sistemas -We es obligatorio evitar
limitaciones de longitud de la línea de comandos.

THE AWK IDIOMA


1. Programa estructura
Un programa AWK es una secuencia de patrón {acción} pares y definiciones de funciones de usuario.

Un patrón puede ser:
EMPEZAR
FIN
expresión
expresión, expresión

Uno, pero no ambos, de patrón {acción} puede ser omitido. Si {acción} se omite es
implícitamente {imprimir}. Si patrón se omite, entonces se empareja implícitamente. EMPEZAR y
FIN los patrones requieren una acción.

Los estados de cuenta terminan con líneas nuevas, punto y coma o ambos. Grupos de declaraciones como
las acciones o los cuerpos de bucle se bloquean mediante {...} como en C. La última sentencia de un bloque
no necesita un terminador. Las líneas en blanco no tienen significado; una declaración vacía se termina
con un punto y coma. Las declaraciones largas pueden continuar con una barra invertida, \. Una declaración puede
romperse sin una barra invertida después de una coma, llave izquierda, &&, ||, do, más, la derecha
paréntesis de un if, mientras or para declaración, y el paréntesis derecho de una función
definición. Un comentario comienza con # y se extiende hasta, pero no incluye el final de la línea.

Las siguientes declaraciones controlan el flujo del programa dentro de los bloques.

if ( expr ) ambiental

if ( expr ) ambiental más ambiental

mientras ( expr ) ambiental

do ambiental mientras ( expr )

para ( opt_expr ; opt_expr ; opt_expr ) ambiental

para ( var in matriz ) ambiental

continuar

descanso

2. Datos tipos conversión y comparación
Hay dos tipos de datos básicos, numéricos y de cadena. Las constantes numéricas pueden ser enteras como
-2, decimal como 1.08, o en notación científica como -1.1e4 o .28E-3. Todos los números son
representados internamente y todos los cálculos se realizan en aritmética de punto flotante. Así que para
ejemplo, la expresión 0.2e2 == 20 es verdadera y verdadera se representa como 1.0.

Las constantes de cadena se incluyen entre comillas dobles.

"Esta es una cadena con una nueva línea al final. \ N"

Las cadenas se pueden continuar a través de una línea escapando (\) de la nueva línea. El siguiente escape
Se reconocen las secuencias.

\\ \
\ ""
\ una alerta, ascii 7
\ b retroceso, ascii 8
pestaña \ t, ascii 9
\ n nueva línea, ascii 10
\ v pestaña vertical, ascii 11
\ f formfeed, ascii 12
\ r retorno de carro, ascii 13
\ ddd 1, 2 o 3 dígitos octales para ascii ddd
\ xhh 1 o 2 dígitos hexadecimales para ascii hh

Si escapa de cualquier otro carácter \ c, obtiene \ c, es decir, mawk ignora el escape.

En realidad, existen tres tipos de datos básicos; el tercero es número y cadena que tiene tanto un
valor numérico y un valor de cadena al mismo tiempo. Las variables definidas por el usuario entran en
existencia cuando se hace referencia por primera vez y se inicializan para nulo, un número y un valor de cadena
que tiene un valor numérico 0 y un valor de cadena "". Número no trivial y datos escritos en cadena
provienen de la entrada y normalmente se almacenan en campos. (Ver sección 4).

El tipo de una expresión está determinado por su contexto y la conversión automática de tipos.
ocurre si es necesario. Por ejemplo, para evaluar las declaraciones

y = x + 2; z = x "hola"

El valor almacenado en la variable y se escribirá de forma numérica. Si x no es numérico, el valor leído
de x se convierte a numérico antes de agregarse a 2 y almacenarse en y. El valor almacenado
en la variable z se escribirá cadena, y el valor de x se convertirá en cadena si
necesario y concatenado con "hola". (Por supuesto, el valor y el tipo almacenados en x es
no cambia por ninguna conversión.) Una expresión de cadena se convierte en numérica utilizando su
prefijo numérico más largo como con en(3). Una expresión numérica se convierte en cadena por
Sustitución expr con sprintf (CONVFMT, expr), a no ser que expr se puede representar en el host
máquina como un entero exacto, luego se convierte a correr("%D", expr). Sprintf () es un
AWK integrado que duplica la funcionalidad de correr(3), y CONVFMT es un incorporado
variable utilizada para la conversión interna de número a cadena e inicializada a "% .6g".
Se pueden forzar conversiones de tipo explícitas, expr "" es una cadena y expr+0 es numérico.

Para evaluar, expr1 rel-op expr2, si ambos operandos son numéricos o numéricos y de cadena, entonces
la comparación es numérica; si ambos operandos son cadenas, la comparación es cadena; si uno
operando es una cadena, el operando que no es una cadena se convierte y la comparación es una cadena. los
el resultado es numérico, 1 o 0.

En contextos booleanos como, if ( expr ) ambiental, una expresión de cadena se evalúa como verdadera si
y solo si no es la cadena vacía ""; valores numéricos si y solo si no numéricamente
cero.

3. Asiento Regular expresiones
En el lenguaje AWK, los registros, campos y cadenas a menudo se prueban para buscar coincidencias regular
expresión. Las expresiones regulares se incluyen entre barras y

expr ~ /r/

es una expresión AWK que se evalúa como 1 si expr "partidos" r, que significa una subcadena de
expr está en el conjunto de cadenas definido por r. Sin coincidencias, la expresión se evalúa como 0;
reemplazar ~ con el operador "no coincide",! ~, invierte el significado. Como patrón-acción
pares,

/r/ { Térmica } y $0 ~ /r/ { Térmica }

son iguales, y para cada registro de entrada que coincida r, Térmica es ejecutado. De hecho, /r/
es una expresión AWK que es equivalente a ($0 ~ /r/) en cualquier lugar excepto cuando esté a la derecha
lado de un operador de coincidencia o pasado como un argumento a una función incorporada que espera un
argumento de expresión regular.

AWK usa expresiones regulares extendidas como con egrep(1). La expresión regular
metacaracteres, es decir, aquellos con un significado especial en expresiones regulares son

^ $. [] | () * +?

Las expresiones regulares se construyen a partir de caracteres de la siguiente manera:

c coincide con cualquier no metacarácter c.

\c coincide con un carácter definido por las mismas secuencias de escape utilizadas en
constantes de cadena o el carácter literal c si \c no es un escape
secuencia.

. coincide con cualquier carácter (incluida la nueva línea).

^ coincide con el anverso de una cuerda.

$ coincide con la parte posterior de una cuerda.

[c1c2c3 ...] coincide con cualquier carácter de la clase c1c2c3 .... Un intervalo de
caracteres se denota c1-c2 dentro de una clase [...].

[^ c1c2c3 ...] coincide con cualquier carácter que no esté en la clase c1c2c3 ...

Las expresiones regulares se crean a partir de otras expresiones regulares de la siguiente manera:

r1rPartidos de 2 r1 seguido inmediatamente por r2 (concatenación).

r1 | rPartidos de 2 r1 o r2 (alternancia).

r* partidos r repetido cero o más veces.

r+ partidos r repetido una o más veces.

r? partidos r cero o una vez.

(r) partidos r, proporcionando agrupación.

La precedencia creciente de los operadores es alternancia, concatenación y unario (*, + o
?).

Por ejemplo,

/ ^ [_ a-zA-Z] [_ a-zA-Z0-9] * $ / y
/^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/

coinciden con identificadores AWK y constantes numéricas AWK, respectivamente. Tenga en cuenta que . tiene que
ser escapado para ser reconocido como un punto decimal, y que los metacaracteres no son especiales
dentro de las clases de personajes.

Cualquier expresión se puede utilizar en el lado derecho de los operadores ~ o! ~ O pasar a un
incorporado que espera una expresión regular. Si es necesario, se convierte en cadena y
luego se interpreta como una expresión regular. Por ejemplo,

COMIENZO {identificador = "[_a-zA-Z] [_ a-zA-Z0-9] *"}

$ 0 ~ identificador "^"

imprime todas las líneas que comienzan con un identificador AWK.

mawk reconoce la expresión regular vacía, //, que coincide con la cadena vacía y, por lo tanto,
se corresponde con cualquier cadena en la parte delantera, trasera y entre cada carácter. Por ejemplo,

echo abc | mawk {gsub (//, "X"); impresión }
XaXbXcX

4. Archivos y campos
Los registros se leen uno por uno y se almacenan en el campo variable $0. El registro es
dividido en campos que se almacenan en $1, $2, ..., $ NF. La variable incorporada NF está ajustado
al número de campos, y NR y FNR se incrementan en 1. Los campos anteriores $ NF se ponen a
"".

Asignación a $0 causa los campos y NF para ser recalculado. Asignación a NF o a un
causas de campo $0 para ser reconstruido concatenando el $ i's separado por FSO.
Asignación a un campo con índice mayor que NFAumenta NF y causas $0 para ser
reconstruido.

La entrada de datos almacenada en los campos es una cadena, a menos que todo el campo tenga forma numérica y luego
el tipo es número y cadena. Por ejemplo,

echo 24 24E |
mawk '{print ($ 1> 100, $ 1> "100", $ 2> 100, $ 2> "100")}'
0 1 1 1

$0 y $2 son cuerdas y $1 es número y cadena. La primera comparación es numérica, la
el segundo es una cadena, el tercero es una cadena (100 se convierte en "100") y el último es una cadena.

5. Expresiones y operadores
La sintaxis de la expresión es similar a C. Las expresiones primarias son constantes numéricas, cadenas
constantes, variables, campos, matrices y llamadas a funciones. El identificador de una variable,
matriz o función puede ser una secuencia de letras, dígitos y guiones bajos, que no
comience con un dígito. Las variables no se declaran; existen cuando se hace referencia por primera vez y son
inicializado a nulo.

Las nuevas expresiones se componen con los siguientes operadores en orden creciente
precedencia.

asignación = + = - = * = / =% = ^ =
condicional ? :
lógico or ||
lógico y &&
matriz La membresía/afiliación in
pareo ~! ~
relacional <> <=> = ==! =
concatenación (sin operador explícito)
add ops + -
mul ops * /%
unario + -
lógico no !
exponenciación ^
y dic ++ - (tanto post como pre)
campo $

Asignación, condicional y exponenciación se asocian de derecha a izquierda; los otros operadores
asociar de izquierda a derecha. Cualquier expresión puede ir entre paréntesis.

6. Matrices
Awk proporciona matrices unidimensionales. Los elementos de la matriz se expresan como matriz[expr]. Expr
se convierte internamente al tipo de cadena, por lo que, por ejemplo, A [1] y A ["1"] son ​​iguales
elemento y el índice real es "1". Las matrices indexadas por cadenas se denominan asociativas
matrices. Inicialmente, una matriz está vacía; los elementos existen cuando se accede por primera vez. Una expresión,
expr in matriz evalúa a 1 si matriz[expr] existe, de lo contrario a 0.

Hay una forma de para declaración que recorre cada índice de una matriz.

para ( var in matriz ) ambiental

conjuntos var a cada índice de matriz y ejecuta ambiental. El orden que var transversos
los índices de matriz no está definido.

La declaración, borrar matriz[expr], causas matriz[expr] no existir. mawk apoya un
extensión, borrar matriz, que elimina todos los elementos de matriz.

Las matrices multidimensionales se sintetizan con concatenación utilizando la variable incorporada
SUBSEP. matriz[expr1,expr2] es equivalente a matriz[expr1 SUBSEP expr2]. Prueba de un
elemento multidimensional utiliza un índice entre paréntesis, como

si ((i, j) en A) imprime A [i, j]

7. Variables integradas
Las siguientes variables están integradas e inicializadas antes de la ejecución del programa.

ARGC número de argumentos de la línea de comandos.

ARGV matriz de argumentos de la línea de comando, 0..ARGC-1.

CONVFMT formato para conversión interna de números a cadena, inicialmente = "% .6g".

REINAR matriz indexada por variables de entorno. Una cadena de entorno, var = valor
se almacena como REINAR[var] = VALORAMOS.

NOMBRE DEL ARCHIVO nombre del archivo de entrada actual.

FNR número de registro actual en NOMBRE DEL ARCHIVO.

FS divide los registros en campos como una expresión regular.

NF número de campos en el registro actual.

NR número de registro actual en el flujo de entrada total.

OFMT formato para imprimir números; inicialmente = "% .6g".

FSO insertado entre los campos en la salida, inicialmente = "".

ORS termina cada registro en la salida, inicialmente = "\ n".

LONGITUD longitud establecida por la última llamada a la función incorporada, partido().

RS separador de registros de entrada, inicialmente = "\ n".

RINICIO índice establecido por la última llamada a partido().

SUBSEP utilizado para construir múltiples subíndices de matriz, inicialmente = "\ 034".

8. Incorporado funciones
Funciones de cadena

gsubr, s, t) gsub (r, s)
Sustitución global, cada coincidencia de expresión regular r en variable t is
reemplazado por cadena s. Se devuelve el número de reemplazos. Si t is
omitido, $0 se utiliza. An & en la cadena de reemplazo s es reemplazado por el
subcadena coincidente de t. \ & y \\ ponen literal & y \, respectivamente, en
la cadena de reemplazo.

índice(S t)
If t es una subcadena de s, luego la posición donde t comienza se devuelve, de lo contrario
Se devuelve 0. El primer personaje de s está en la posición 1.

largo(s)
Devuelve la longitud de la cadena s.

fósforo(s, r)
Devuelve el índice de la primera coincidencia más larga de expresión regular. r in
cadena s. Devuelve 0 si no coincide. Como efecto secundario, RINICIO se establece en el
valor de retorno. LONGITUD se establece en la duración de la coincidencia o -1 si no hay coincidencia.
Si la cadena vacía coincide, LONGITUD se establece en 0 y se devuelve 1 si
el fósforo está en la parte delantera, y la longitud (s) +1 se devuelve si la coincidencia es en
la parte de atrás.

separar(s, A, r) separar(s, A)
Cordón s se divide en campos por expresión regular r y los campos son
cargado en la matriz A. Se devuelve el número de campos. Ver sección 11
a continuación para obtener más detalles. Si r se omite, FS se utiliza.

sprintf (formato, lista-expr)
Devuelve una cadena construida a partir de lista-expr de acuerdo a formato. Consulte la
descripción de printf () a continuación.

sub(r, s, t) sub (r, s)
Sustitución simple, igual que gsub () excepto como máximo una sustitución.

substrpecado) substr (si)
Devuelve la subcadena de cadena s, comenzando en el índice i, de longitud n. Si n
se omite, el sufijo de s, A partir de i es regresado.

reducir(s)
Devuelve una copia de s con todos los caracteres en mayúscula convertidos a minúsculas.

touppers)
Devuelve una copia de s con todos los caracteres en minúscula convertidos a mayúsculas.

Funciones aritméticas

atan2y, x) Arctan de y/x entre -pi y pi.

cosx) Función coseno, x en radianes.

Exp(x) Funcion exponencial.

En t(x) Devoluciones x truncado hacia cero.

Iniciar sesión(x) Logaritmo natural.

rand () Devuelve un número aleatorio entre cero y uno.

pecado(x) Función seno, x en radianes.

sqrtx) Devuelve la raíz cuadrada de x.

srandexpr) srand ()
Siembra el generador de números aleatorios, usando el reloj si expr se omite, y
devuelve el valor de la semilla anterior. mawk semillas el número aleatorio
generador del reloj al inicio, por lo que no hay necesidad real de llamar
srand (). Srand (expr) es útil para repetir secuencias pseudoaleatorias.

9. Entrada y salida
Hay dos declaraciones de salida, Imprimir y Printf.

imprimir escribe $0 ORS a salida estándar.

Imprimir expr1, expr2, ..., exprn
escribe expr1 FSO expr2 FSO ... exprn ORS a salida estándar. Numérico
las expresiones se convierten en cadenas con OFMT.

Printf formato, lista-expr
duplica la función de la biblioteca printf C escribiendo en la salida estándar. los
las especificaciones completas del formato ANSI C se reconocen con conversiones% c,
% d,% e,% E,% f,% g,% G,% i,% o,% s,% u,% x,% X y %%, y conversión
calificadores h y l.

La lista de argumentos para imprimir o printf se puede incluir opcionalmente entre paréntesis. Impresión
formatea números usando OFMT o "% d" para números enteros exactos. "% c" con un argumento numérico
imprime el carácter de 8 bits correspondiente, con un argumento de cadena imprime el primero
carácter de la cadena. La salida de print e printf se puede redirigir a un archivo o
comando agregando> presentar, >> presentar o | comando al final de la declaración impresa.
Se abre la redirección presentar or comando sólo una vez, las redirecciones posteriores se añaden a la ya
corriente abierta. Por convención, mawk asocia el nombre del archivo "/ dev / stderr"con stderr que
permite redirigir print e printf a stderr. mawk también asocia "-" y
"/ dev / stdout" con stdin y stdout que permite que estos flujos se pasen a funciones.

La función de entrada obtener línea tiene las siguientes variaciones.

obtener línea
lee en $0, actualiza los campos, NF, NR y FNR.

obtener línea presentar
lee en $0 desde presentar, actualiza los campos y NF.

obtener línea var
lee el siguiente registro en var, actualizaciones NR y FNR.

obtener línea var < presentar
lee el siguiente registro de presentar dentro var.

comando | obtener línea
canaliza un registro de comando dentro $0 y actualiza los campos y NF.

comando | obtener línea var
canaliza un registro de comando dentro var.

Getline devuelve 0 al final del archivo, -1 en caso de error, de lo contrario 1.

Los comandos al final de las tuberías son ejecutados por / bin / sh.

La función Cerrar(expr) cierra el archivo o canalización asociado con expr. Cerrar devuelve 0 si
expr es un archivo abierto, el estado de salida si expr es un comando canalizado y -1 en caso contrario. Cerrar
se usa para volver a leer un archivo o comando, asegúrese de que el otro extremo de una tubería de salida esté terminado
o conservar los recursos del archivo.

La función rubor(expr) vacía el archivo de salida o la tubería asociada con expr. Enjuague
devuelve 0 si expr es un flujo de salida abierto else -1. Lavar sin un argumento se vacía
stdout. Vaciar con un argumento vacío ("") vacía toda la salida abierta.

La función iTero(expr) usos / Bin / sh ejecutar expr y devuelve el estado de salida del
comando expr. Cambios realizados en el REINAR La matriz no se pasa a los comandos ejecutados con
iTero o tuberías.

10. Usuario se define funciones
La sintaxis de una función definida por el usuario es

función nombre args ) { declaraciones }

El cuerpo de la función puede contener una declaración de retorno

retorno opt_expr

No se requiere declaración de devolución. Las llamadas a funciones pueden ser anidadas o recursivas. Funciones
se pasan expresiones por valor y matrices por referencia. Los argumentos adicionales sirven como locales
variables y se inicializan para nulo. Por ejemplo, csplit (s, A) pone cada carácter de s
en matriz A y devuelve la longitud de s.

función csplit (s, A, n, i)
{
n = longitud (s)
para (i = 1; i <= n; i ++) A [i] = substr (s, i, 1)
volver n
}

Poner espacio extra entre los argumentos pasados ​​y las variables locales es convencional.
Se puede hacer referencia a las funciones antes de definirlas, pero el nombre de la función y el '(' de
los argumentos deben tocarse para evitar confusiones con la concatenación.

11. Splitting instrumentos de cuerda, archivos y archivos
Los programas Awk utilizan el mismo algoritmo para dividir cadenas en matrices con split () y registros
en campos en FS. mawk utiliza esencialmente el mismo algoritmo para dividir archivos en registros
on RS.

División(expr, A, sep) funciona de la siguiente manera:

(1) si sep se omite, se reemplaza por FS. Sep puede ser una expresión o
expresión regular. Si es una expresión de tipo que no es de cadena, es
convertido a cadena.

(2) si sep = "" (un solo espacio), luego está recortado desde el frente y
detrás de expry sep se convierte en . mawk define como el regular
expresión / [\ t \ n] +/. De lo contrario sep se trata como una expresión regular,
excepto que los metacaracteres se ignoran para una cadena de longitud 1, por ejemplo,
split (x, A, "*") y split (x, A, / \ * /) son iguales.

(3) si expr no es una cadena, se convierte en una cadena. Si expr es entonces el vacio
cadena "", split () devuelve 0 y A está vacío. De lo contrario, todos los
coincidencias superpuestas, no nulas y más largas de sep in exprseparado expr dentro
campos que se cargan en A. Los campos se colocan en A [1], A [2], ...,
A [n] y split () devuelve n, el número de campos que es el número de
partidos más uno. Datos colocados en A que parece numérico es un número escrito y
cadena.

La división de registros en campos funciona igual, excepto que las piezas se cargan en $1, $2, ...,
$ NF. Si $0 esta vacio, NF se establece en 0 y todo $i para "".

mawk divide archivos en registros mediante el mismo algoritmo, pero con la ligera diferencia de que
RS es realmente un terminador en lugar de un separador. (ORS es realmente un terminador también).

Por ejemplo, si FS = ": +" y $0 = "a :: b:", entonces NF = 3 y $1 = "a", $2 = "b" y $3 =
"", pero si "a :: b:" es el contenido de un archivo de entrada y RS = ": +", entonces hay
dos registros "a" y "b".

RS = "" no es especial.

If FS = "", entonces mawk rompe el récord en caracteres individuales y, de manera similar,
separar(s, A,"") coloca los caracteres individuales de s dentro A.

12. Multilínea archivos
Como mawk Intérpretes RS como expresión regular, los registros de varias líneas son fáciles. Configuración RS
= "\ n \ n +", hace que una o más líneas en blanco separen los registros. Si FS = "" (el predeterminado),
luego líneas nuevas individuales, según las reglas para arriba, se convierten en espacio y nuevas líneas únicas son
separadores de campo.

Por ejemplo, si un archivo es "ab \ nc \ n \ n", RS = "\ n \ n +" y FS = "", entonces hay
un registro "ab \ nc" con tres campos "a", "b" y "c". Cambiando FS = "\ n", da
dos campos "ab" y "c"; cambiando FS = "", da un campo idéntico al
registro.

Si desea que las líneas con espacios o tabulaciones se consideren en blanco, establezca RS = "\ n ([\ t] * \ n) +".
Para compatibilidad con otros awks, establezca RS = "" tiene el mismo efecto que si las líneas en blanco
se eliminan del anverso y el reverso de los archivos y luego los registros se determinan como si RS =
"\ n \ n +". Posix requiere que "\ n" siempre separe los registros cuando RS = "" independientemente del
valor de FS. mawk no es compatible con esta convención, porque definir "\ n" como
lo hace innecesario.

La mayor parte del tiempo cuando cambias RS para registros de varias líneas, también querrá cambiar
ORS a "\ n \ n" para que el espaciado de registros se conserve en la salida.

13. Programa ejecución
Esta sección describe el orden de ejecución del programa. Primero ARGC se establece en el total
número de argumentos de la línea de comando pasados ​​a la fase de ejecución del programa. ARGV [0] is
establezca el nombre del intérprete AWK y ARGV [1] ... ARGV [ARGC-1] sostiene el restante
Argumentos de línea de comando exclusivos de opciones y fuente del programa. Por ejemplo con

mawk -f prog v = 1 A t = hola B

ARGC = 5 con ARGV [0] = "mawk", ARGV [1] = "v = 1", ARGV [2] = "A", ARGV [3] = "t = hola" y
ARGV [4] = "B".

A continuación, cada EMPEZAR el bloque se ejecuta en orden. Si el programa consta completamente de EMPEZAR
bloques, luego termina la ejecución, de lo contrario se abre un flujo de entrada y la ejecución continúa.
If ARGC es igual a 1, el flujo de entrada se establece en stdin, de lo contrario, los argumentos de la línea de comando
ARGV [1] ... ARGV [ARGC-1] se examinan en busca de un argumento de archivo.

Los argumentos de la línea de comando se dividen en tres conjuntos: argumentos de archivo, argumentos de asignación
y cadenas vacías "". Una tarea tiene la forma var=cadena. Cuando un ARGV [i] es examinado
como posible argumento de archivo, si está vacío se omite; si es una tarea
argumento, la asignación a var tiene lugar y i pasa al siguiente argumento; demás ARGV [i]
está abierto para entrada. Si no se abre, la ejecución termina con el código de salida 2. Si no
El argumento de la línea de comandos es un argumento de archivo, luego la entrada proviene de stdin. Getline en un EMPEZAR
la acción abre la entrada. "-" como argumento de archivo denota stdin.

Una vez que se abre un flujo de entrada, cada registro de entrada se prueba con cada patrón, y si es
coincidencias, el asociado Térmica es ejecutado. Un patrón de expresión coincide si es
boolean true (ver el final de la sección 2). A EMPEZAR patrón coincide antes de que cualquier entrada tenga
ha sido leído, y un FIN el patrón coincide después de que se hayan leído todas las entradas. Un patrón de rango,
expr1,expr2, coincide con todos los registros entre el partido de expr1 y el partido expr2
inclusive.

Cuando ocurre el final del archivo en el flujo de entrada, los argumentos restantes de la línea de comando son
examinado en busca de un argumento de archivo, y si hay uno, se abre, de lo contrario, el FIN patrón is
considerado emparejado y todo FIN acciones se ejecutan.

En el ejemplo, la asignación v = 1 tiene lugar después de la EMPEZAR acciones se ejecutan, y
los datos colocados en v se escriben en número y cadena. A continuación, la entrada se lee del archivo A. Al final
del archivo A, t se establece en la cadena "hola" y B se abre para la entrada. Al final del archivo B,
los FIN acciones se ejecutan.

Flujo del programa en el patrón {acción} El nivel se puede cambiar con el

siguiente
salida opt_expr

declaraciones. A siguiente La instrucción hace que se lea el siguiente registro de entrada y se pruebe el patrón.
para reiniciar con el primero patrón {acción} emparejar en el programa. Un salida declaración de causas
ejecución inmediata de la FIN acciones o terminación del programa si no hay ninguno o si el
salida ocurre en un FIN acción. los opt_expr establece el valor de salida del programa a menos que
anulado por un posterior salida o error posterior.

EJEMPLOS


1. emular al gato.

{ impresión }

2. emular wc.

{caracteres + = longitud ($ 0) + 1 # agregue uno para el \ n
palabras + = NF
}

FIN {imprimir NR, palabras, caracteres}

3. cuente el número de "palabras reales" únicas.

COMIENZO {FS = "[^ A-Za-z] +"}

{para (i = 1; i <= NF; i ++) palabra [$ i] = ""}

FIN {eliminar palabra [""]
para (i en palabra) cnt ++
imprimir cnt
}

4. Sume el segundo campo de cada registro basado en el primer campo.

$ 1 ~ / crédito | ganancia / {suma + = $ 2}
$ 1 ~ / débito | pérdida / {suma - = $ 2}

FIN {imprimir suma}

5. ordenar un archivo, comparándolo como una cadena

{line [NR] = $ 0 ""} # asegúrese del tipo de comparación
# en caso de que algunas líneas parezcan numéricas

END {isort (línea, NR)
para (i = 1; i <= NR; i ++) imprimir línea [i]
}

# inserción tipo A [1..n]
función isort (A, n, i, j, mantener)
{
para (i = 2; i <= n; i ++)
{
mantener = A [j = i]
mientras (A [j-1]> mantener)
{j--; A [j + 1] = A [j]}
A [j] = mantener
}
Se creará # centinela A [0] = "" si es necesario
}

COMPATIBILIDAD CUESTIONES


La definición de Posix 1003.2 (borrador 11.3) del lenguaje AWK es AWK como se describe en AWK
libro con algunas extensiones que aparecieron en SystemVR4 nawk. Las extensiones son:

Nuevas funciones: toupper () y tolower ().

Nuevas variables: ENVIRON [] y CONVFMT.

Especificaciones de conversión ANSI C para printf () y sprintf ().

Nuevas opciones de comando: -v var = valor, múltiples opciones -f y opciones de implementación
como argumentos para -W.

Posix AWK está orientado a operar en archivos línea a línea. RS se puede cambiar de "\ n"
a otro carácter, pero es difícil encontrar algún uso para esto - no hay
ejemplos en el libro AWK. Por convención, RS = "", separa una o más líneas en blanco
registros, lo que permite registros de varias líneas. Cuando RS = "", "\ n" es siempre un separador de campo
independientemente del valor en FS.

mawk, por otro lado, permite RS para ser una expresión regular. Cuando aparece "\ n" en
registros, se trata como espacio, y FS siempre determina los campos.

Eliminar el paradigma de línea en un momento puede simplificar algunos programas y, a menudo, puede mejorar
rendimiento. Por ejemplo, rehaciendo el ejemplo 3 anterior,

COMIENZO {RS = "[^ A-Za-z] +"}

{palabra [$ 0] = ""}

FIN {eliminar palabra [""]
para (i en palabra) cnt ++
imprimir cnt
}

cuenta el número de palabras únicas convirtiendo cada palabra en un registro. En archivos de tamaño moderado,
mawk se ejecuta dos veces más rápido, debido al bucle interno simplificado.

El siguiente programa reemplaza cada comentario por un solo espacio en un archivo de programa C,

EMPEZAR {
RS = "/ \ * ([^ *] | \ * + [^ / *]) * \ * + /"
# comentario es un separador de registros
ORS = ""
getline espera
}

{retención de impresión; mantener = $ 0}

FIN {printf "% s", mantener}

Es necesario almacenar un registro en búfer para evitar terminar el último registro con un espacio.

Con mawk, los siguientes son todos equivalentes,

x ~ / a \ + b / x ~ "a \ + b" x ~ "a \\ + b"

Las cadenas se escanean dos veces, una como cadena y otra como expresión regular. Sobre el
escaneo de cadenas, mawk ignora el escape de los personajes que no son de escape, mientras que el libro AWK defiende
\c ser reconocido como c que requiere el doble escape de los metacaracteres en
instrumentos de cuerda. Posix se niega explícitamente a definir el comportamiento que obliga pasivamente a los programas
que debe ejecutarse bajo una variedad de awks para usar el más portátil pero menos legible, doble
escapar.

Posix AWK no reconoce las secuencias de escape "/ dev / std {out, err}" o \ x hex en cadenas.
A diferencia de ANSI C, mawk limita el número de dígitos que sigue a \ xa dos como el actual
la implementación solo admite caracteres de 8 bits. El incorporado rubor apareció por primera vez en un
reciente (1993) AT&T awk lanzado a netlib, y no es parte del estándar posix.
Deleción agregada con borrar matriz no es parte del estándar posix.

Posix deja explícitamente el comportamiento de FS = "" indefinido y menciona la división de
grabar en caracteres como una posible interpretación, pero actualmente este uso no es
portable a través de implementaciones.

Finalmente, así es como mawk maneja casos excepcionales no discutidos en el libro AWK o el
Borrador Posix. No es seguro asumir la coherencia entre awks y es seguro pasar al siguiente
.

substr (s, i, n) devuelve los caracteres de s en la intersección del cerrado
intervalo [1, longitud (s)] y el intervalo semiabierto [i, i + n). Cuando esto
la intersección está vacía, se devuelve la cadena vacía; entonces substr ("ABC", 1, 0) = ""
y substr ("ABC", -4, 6) = "A".

Cada cadena, incluida la cadena vacía, coincide con la cadena vacía en el frente, por lo que,
s ~ // y s ~ "", son siempre 1 como coinciden (s, //) y coinciden (s, ""). Los últimos dos
planificadas LONGITUD a 0.

index (s, t) es siempre el mismo que match (s, t1) donde t1 es lo mismo que t con
los metacaracteres escaparon. Por lo tanto, la coherencia con la coincidencia requiere que el índice (s, "")
siempre devuelve 1. También la condición, index (s, t)! = 0 si y solo t es una subcadena
de s, requiere índice ("", "") = 1.

Si getline encuentra el final del archivo, getline var, deja var sin cambios. Similar,
a la entrada al FIN comportamiento, $0, los campos y NF tienen su valor inalterado desde
el último registro.

Utilice mawk en línea utilizando los servicios de onworks.net


Ad


Ad

Últimos programas en línea de Linux y Windows