Étant donné la commande suivante:
echo "1: " | awk '/1/ -F ":" {print $1}'
pourquoi la sortie awk:
1:
Étant donné la commande suivante:
echo "1: " | awk '/1/ -F ":" {print $1}'
pourquoi la sortie awk:
1:
Réponses:
"-F" est un argument de ligne de commande et non une syntaxe awk, essayez:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Si pattern
(principalement une instruction conditionnelle) est vrai , action
est exécuté. Si pattern
n'est pas disponible, true
est implicite. Ici , le pattern
est selon /1/
lequel est regex 1
apparié dans l'enregistrement en cours$0
Si vous voulez le faire par programme, vous pouvez utiliser la FS
variable:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Notez que si vous le modifiez dans la boucle principale plutôt que dans la BEGIN
boucle, il prend effet pour la ligne suivante lue, car la ligne actuelle a déjà été divisée.
Vous avez plusieurs façons de définir :
comme séparateur:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Tous sont équivalents et pour un retourne 1
pour un exemple d'entrée "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
déclaration serait le plus correct (étant cohérent avec la awk
syntaxe globale ).
BEGIN
si j'utilise un fichier pour stocker le tout, tout -F
en étant pratique avec les monolignes.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
etawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Pas besoin d'écrire autant. Mettez simplement votre séparateur de champs souhaité avec l'option -F dans la commande awk et le numéro de colonne que vous souhaitez imprimer séparé selon votre séparateur de champs mentionné.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK fonctionne comme un interpréteur de texte qui va dans le sens des lignes pour tout le document et qui va dans le champ pour chaque ligne, donc $ 1, $ 2 .. $ n sont des références aux champs de chaque ligne ($ 1 est le premier champ, $ 2 est le deuxième champ et ainsi de suite ...). Vous pouvez définir un séparateur de champ en utilisant le commutateur "-F" sous la ligne de commande ou entre deux crochets avec "FS = ...". Considérez maintenant la réponse de "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Au-dessus des limites de champ sont définies par ":" donc nous avons deux champs $ 1 qui est "1" et $ 2 qui EST l'espace vide. Après, vient l'expression régulière "/ 1 /" qui demande au filtre de sortir le premier champ uniquement lorsque l'interprète tombe sur une ligne contenant une telle expression (je veux dire 1); La sortie de la commande "echo" est une ligne qui contient "1" pour que le filtre fonctionne ...
Lorsque vous traitez l'exemple suivant:
echo "1: " | awk '/1/ -F ":" {print $1}'
La syntaxe est désordonnée et l' interprète a choisi d'ignorer la partie F ":" et passe au séparateur de champs par défaut qui est l'espace vide produisant ainsi "1:" comme premier champ et il n'y aura pas de deuxième champ!
La réponse de JUERGEN contient la bonne syntaxe ...