La pregunta de Ignorante aquí: la parte / 1 / es decirle a awk que solo procese filas (o registros para ser más precisos) que contienen el número 1, ¿verdad?
rantsh
3
Parece la sintaxis de @rantsh Awk (pattern){action}. Si pattern(principalmente una declaración condicional) es verdadero , actionse ejecuta. Si patternno está disponible, trueestá implícito. Aquí patternestá /1/qué estados son expresiones regulares 1coincidentes en el registro actual$0
kvantour
62
Si quieres hacerlo programáticamente, puedes usar la FSvariable:
Tenga en cuenta que si lo cambia en el bucle principal en lugar del BEGINbucle, tiene efecto para la siguiente línea leída, ya que la línea actual ya se ha dividido.
cual es la forma preferida Supongo que el ejemplo final con la BEGINdeclaración sería el más correcto (siendo coherente con la awksintaxis general ).
1
@randomware todos ellos están bien. Tiendo a usar BEGINsi uso un archivo para almacenar todo, mientras que -Fes útil con frases ingeniosas.
Fedorqui 'así que deja de dañar'
1
Hay que decir que hay diferencias sutiles entre el tercer caso y todos los demás. Ejemplo: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileyawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
También puede usar una expresión regular como separador de campo, lo siguiente imprimirá "barra" usando una expresión regular para establecer el número "10" como separador.
No es necesario escribir tanto. Simplemente coloque el separador de campo deseado con la opción -F en el comando awk y el número de columna que desea imprimir segregado según su separador de campo mencionado.
AWK funciona como un intérprete de texto que va en línea para todo el documento y que va en campo para cada línea, por lo tanto $ 1, $ 2 .. $ n son referencias a los campos de cada línea ($ 1 es el primer campo, $ 2 es el segundo campo, etc.) ...) Puede definir un separador de campo utilizando el interruptor "-F" debajo de la línea de comando o entre dos corchetes con "FS = ...". Ahora considere la respuesta de "JUERGEN":
echo "1: "| awk -F ":"'/1/ {print $1}'
Por encima de los límites del campo se establecen con ":", por lo que tenemos dos campos $ 1, que es "1" y $ 2, que ES el espacio vacío. Después, viene la expresión regular "/ 1 /" que indica al filtro que solo muestre el primer campo cuando el intérprete tropieza con una línea que contiene dicha expresión (quiero decir 1); La salida del comando "echo" es una línea que contiene "1" para que el filtro funcione ...
Cuando se trata con el siguiente ejemplo:
echo "1: "| awk '/1/ -F ":" {print $1}'
La sintaxis es desordenada y el intérprete decidió ignorar la parte F ":"
y cambia al divisor de campo predeterminado, que es el espacio vacío, lo que genera "1:" como primer campo y no habrá un segundo campo.
La respuesta de JUERGEN contiene la buena sintaxis ...
(pattern){action}
. Sipattern
(principalmente una declaración condicional) es verdadero ,action
se ejecuta. Sipattern
no está disponible,true
está implícito. Aquípattern
está/1/
qué estados son expresiones regulares1
coincidentes en el registro actual$0
Si quieres hacerlo programáticamente, puedes usar la
FS
variable:Tenga en cuenta que si lo cambia en el bucle principal en lugar del
BEGIN
bucle, tiene efecto para la siguiente línea leída, ya que la línea actual ya se ha dividido.fuente
Tiene varias formas de establecer
:
como separador:Todos ellos son equivalentes y para un regresará
1
para una entrada de muestra "1: 2: 3":fuente
BEGIN
declaración sería el más correcto (siendo coherente con laawk
sintaxis general ).BEGIN
si uso un archivo para almacenar todo, mientras que-F
es útil con frases ingeniosas.awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
yawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
es un argumento enawk
sí mismo:fuente
También puede usar una expresión regular como separador de campo, lo siguiente imprimirá "barra" usando una expresión regular para establecer el número "10" como separador.
fuente
No es necesario escribir tanto. Simplemente coloque el separador de campo deseado con la opción -F en el comando awk y el número de columna que desea imprimir segregado según su separador de campo mencionado.
fuente
AWK funciona como un intérprete de texto que va en línea para todo el documento y que va en campo para cada línea, por lo tanto $ 1, $ 2 .. $ n son referencias a los campos de cada línea ($ 1 es el primer campo, $ 2 es el segundo campo, etc.) ...) Puede definir un separador de campo utilizando el interruptor "-F" debajo de la línea de comando o entre dos corchetes con "FS = ...". Ahora considere la respuesta de "JUERGEN":
Por encima de los límites del campo se establecen con ":", por lo que tenemos dos campos $ 1, que es "1" y $ 2, que ES el espacio vacío. Después, viene la expresión regular "/ 1 /" que indica al filtro que solo muestre el primer campo cuando el intérprete tropieza con una línea que contiene dicha expresión (quiero decir 1); La salida del comando "echo" es una línea que contiene "1" para que el filtro funcione ...
Cuando se trata con el siguiente ejemplo:
La sintaxis es desordenada y el intérprete decidió ignorar la parte F ":" y cambia al divisor de campo predeterminado, que es el espacio vacío, lo que genera "1:" como primer campo y no habrá un segundo campo.
La respuesta de JUERGEN contiene la buena sintaxis ...
fuente
O puedes usar:
Esta es una ecuación realmente divertida.
fuente
/1/
significa