web-dev-qa-db-fra.com

Comment utiliser ":" comme séparateur de champs awk?

Compte tenu de la commande suivante:

echo "1: " | awk '/1/ -F ":" {print $1}'

pourquoi awk affiche-t-il:

1: 
218
user173446

"-F" est un argument de ligne de commande et non une syntaxe awk, essayez:

 echo "1: " | awk -F  ":" '/1/ {print $1}'
344
Jürgen Hötzel

Si vous voulez le faire par programme, vous pouvez utiliser la variable FS:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

Notez que si vous le modifiez dans la boucle principale plutôt que dans la boucle BEGIN, cela prend effet pour la ligne suivante lue, car la ligne en cours a déjà été scindée.

57

Vous avez plusieurs façons de définir : en tant que 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 an retournera 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
25
fedorqui

-F est un argument de awk lui-même:

$echo "1: " | awk -F":" '/1/ {print $1}'
1
12
danben

Vous pouvez également utiliser une expression rationnelle comme séparateur de champ. Le texte suivant imprimera "barre" en utilisant une expression régulière pour définir le nombre "10" en tant que séparateur.

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
6
Zlemini

AWK fonctionne comme un interpréteur de texte qui va ligne par ligne pour tout le document et qui va case par ligne 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érons 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 IS l'espace vide.Après, vient l'expression régulière "/ 1 /" qui indique le filtre pour sortir le premier champ uniquement lorsque l'interprète tombe sur une ligne contenant une telle expression (i signifie 1); La sortie de la commande "echo" est une ligne qui contient "1" afin que le filtre fonctionne ...

Lorsque vous traitez avec l'exemple suivant:

echo "1: " | awk '/1/ -F ":" {print $1}'

La syntaxe est compliquée et le l'interpréteur a choisi d'ignorer la partie F ":" et passe au séparateur de champ par défaut qui est l'espace vide, générant ainsi "1:" comme premier champ et il n'y aura pas un deuxième terrain!

La réponse de JUERGEN contient la bonne syntaxe ...

5
jihed gasmi

Pas besoin d'écrire ça beaucoup. Il suffit de mettre votre séparateur de champ souhaité avec l'option -F dans la commande awk et le numéro de colonne que vous voulez imprimer séparément selon votre séparateur de champ mentionné.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1
3
Bhavuk Taneja

Ou vous pouvez utiliser:

echo "1: " | awk  '/1/{print $1-":"}' 

C'est une équation vraiment amusante.

2
Vonton