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 , actionse ejecuta. Si patternno está disponible, trueestá implícito. Aquí patternestá /1/qué estados son expresiones regulares 1coincidentes en el registro actual$0
Si quieres hacerlo programáticamente, puedes usar la FSvariable:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
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.
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á 1para 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
BEGINdeclaración sería el más correcto (siendo coherente con la awksintaxis general ).
BEGINsi uso un archivo para almacenar todo, mientras que -Fes útil con frases ingeniosas.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileyawk '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 ...