La question de Ignorant ici: la partie / 1 / est de dire à awk de ne traiter que les lignes (ou les enregistrements pour être plus précis) qui contiennent le numéro 1, n'est-ce pas?
rantsh
3
La syntaxe @rantsh Awk ressemble (pattern){action}. Si pattern(principalement une instruction conditionnelle) est vrai , actionest exécuté. Si patternn'est pas disponible, trueest implicite. Ici , le patternest selon /1/lequel est regex 1apparié dans l'enregistrement en cours$0
kvantour
62
Si vous voulez le faire par programme, vous pouvez utiliser la FSvariable:
Notez que si vous le modifiez dans la boucle principale plutôt que dans la BEGINboucle, il prend effet pour la ligne suivante lue, car la ligne actuelle a déjà été divisée.
quelle est la voie préférée? je suppose que l'exemple final avec la BEGINdéclaration serait le plus correct (étant cohérent avec la awksyntaxe globale ).
1
@randomware tous vont bien. J'ai tendance à utiliser BEGINsi j'utilise un fichier pour stocker le tout, tout -Fen étant pratique avec les monolignes.
fedorqui 'SO arrête de nuire'
1
Il faut dire qu'il existe des différences subtiles entre le troisième cas et tous les autres. Exemple: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileetawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Vous pouvez également utiliser une expression régulière comme séparateur de champ, ce qui suit imprimera "barre" en utilisant une expression régulière pour définir le nombre "10" comme séparateur.
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é.
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 ...
(pattern){action}
. Sipattern
(principalement une instruction conditionnelle) est vrai ,action
est exécuté. Sipattern
n'est pas disponible,true
est implicite. Ici , lepattern
est selon/1/
lequel est regex1
apparié dans l'enregistrement en cours$0
Si vous voulez le faire par programme, vous pouvez utiliser la
FS
variable: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.la source
Vous avez plusieurs façons de définir
:
comme séparateur:Tous sont équivalents et pour un retourne
1
pour un exemple d'entrée "1: 2: 3":la source
BEGIN
déclaration serait le plus correct (étant cohérent avec laawk
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
-F
est un argument enawk
soi:la source
Vous pouvez également utiliser une expression régulière comme séparateur de champ, ce qui suit imprimera "barre" en utilisant une expression régulière pour définir le nombre "10" comme séparateur.
la source
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é.
la source
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":
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:
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 ...
la source
Ou vous pouvez utiliser:
C'est une équation vraiment drôle.
la source
/1/
signifie?