awk pour plusieurs motifs
Hé les gars, petite question
mon fichier ressemble à ceci:
L 0 256 * * * * *
H 0 307 100.0 + 0 0
S 30 351 * * * * *
D 8 27 * * * * 99.3
C 11 1 * * * * *
pour mon script, je voudrais commencer par awk print $0 pour certaines lignes à l'aide de $1
Comme
awk '{if ($1!="C") {print $0} else if ($1!="D") {print $0}}'
Mais, il y a un moyen de combiner les "C" et "D" dans une instruction if...?
Par exemple si je veux rechercher == L,H,S ie... PAS C ou D, comment pourrais-je le droit?
Juste curieux 😀
Merci
Jonathan
OriginalL'auteur jon_shep | 2012-10-29
Vous devez vous connecter pour publier un commentaire.
Votre situation actuelle n'est pas correcte, puisque les deux
$1!="C"
et$1!="D"
ne peuvent pas être fausses en même temps. Par conséquent, il sera toujours l'impression que l'ensemble du fichier.Cela va faire comme vous l'avez décrit:
Qui explique pourquoi il ne serait pas de travail alors que le même énoncé avec de multiples vérités travaillé. Mon fond est la biologie pas de CS donc je suis en train d'apprendre que je vais.
Je suppose que dans la biologie, il est parfois possible pour des choses impossibles à travailler. 🙂
OriginalL'auteur P.P.
Utilisation de awk, vous pouvez prévoir des règles pour des motifs spécifiques, avec la syntaxe
voir le awk page de manuel pour la définition d'un modèle. Dans votre cas, vous pouvez utiliser une expression régulière comme un motif avec la syntaxe
et une base de l'expression régulière qui répondent à vos besoins pourraient être
qui vous pouvez réellement raccourcir en
depuis
{print $0}
est l'action par défaut, comme suggéré dans les commentaires.Cela ne fonctionne que si il n'y a pas d'espaces avant $1. Aussi, vous n'avez pas besoin d' {print $0}, comme c'est l'action par défaut.
En effet, ici
/^[^CD]/
se traduit par :/…/
son motif,/^…/
le motif est au début de la ligne,/^[^CD]/
la première lettre ne doit pas être un C ou D. par conséquent, comme vous le dites, cela ne fonctionnera pas dans le cas où un caractère est placé avant le C ou le D, et cela permettra également de filtrer toute ligne commençant par un mot ayant C ou D comme de sa première lettre.Je sais qu'il y a beaucoup de awk livres et d'autres documents que les divagations au sujet du "modèle"s (certaines écrites par le gars qui a inventé l'outil!) mais ils ont tort - le awk corps est composé de <condition> { <action> } segments, et non pas <modèle> { <action> } segments, sinon, comment expliquez-vous "x > 2 { print }"? "x > 2" est clairement une condition, pas un "pattern". En tout cas, /.../ est un RE, pas un modèle et dans ce contexte, c'est court pour $0 ~ /.../, qui est un état, pas un modèle.
Vous êtes de droite. J'ai peut-être utilisé le terme de “modèle” mal. Selon le awk manuel d'un “pattern” est ce que vous appelez un
<condition>
dans votre commentaire. Je vais modifier ma réponse en prenant votre remarque en compte.OriginalL'auteur Vincent Nivoliers
C'est rien de compliqué. Awk est composée de <condition> { <action> } segments où vous effectuez l'action si la condition est vraie. Il y a une condition par défaut de "vrai" et une action par défaut de "print $0" donc tous les 5 de ces expressions sont équivalentes: '1 == 1 { print $0 }', '{print $0}', '1 == 1', '{print}', '1', et chacun d'entre eux il suffit d'imprimer l'enregistrement en cours.
Je comprends que la fin d'une expression avec / moyenne {print $0} et que ~ doit être égale à == right? mais pourquoi avez-vous envelopper votre modèle [x] dans / 's ?
Vous ne comprenez pas le sens de "/" et "~". /../ sont les délimiteurs pour une constante de l'expression régulière. "~" est l'expression régulière de l'opérateur et peut être appliqué à une constante REs, ou des variables contenant REs ou RE cordes. Tous ceux-là sont les conditions et sont donc complètement indépendants {print $0}, qui est une action.
Je vous recommande de prendre le livre "Effective Awk Programming, Troisième Édition Par Arnold Robbins" (oreilly.com/catalog/awkprog3) comme il l'explique tout cela. En attendant, pendant que vous attendez qu'il arrive, le texte est en ligne à l'adresse gnu.org/software/gawk/manual/gawk.html.
OriginalL'auteur Ed Morton