Dado el siguiente comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
¿Por qué la salida awk:
1:
Dado el siguiente comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
¿Por qué la salida awk:
1:
Respuestas:
"-F" es un argumento de línea de comando que no es una sintaxis awk, intente:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Si pattern
(principalmente una declaración condicional) es verdadero , action
se ejecuta. Si pattern
no está disponible, true
está implícito. Aquí pattern
está /1/
qué estados son expresiones regulares 1
coincidentes en el registro actual$0
Si quieres hacerlo programáticamente, puedes usar la FS
variable:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
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.
Tiene varias formas de establecer :
como separador:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Todos ellos son equivalentes y para un regresará 1
para una entrada de muestra "1: 2: 3":
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
declaración sería el más correcto (siendo coherente con la awk
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
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.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
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 ...