Passage de Variable NR dans AWK commande ne fonctionne pas
Salut, je suis en train d'imprimer le 5 lignes après une expression régulière a été trouvé à l'aide de la commande awk. J'ai le texte suivant:
line_start=$(awk '/regex/{print NR}' file)
let line_end=$line_start+4
awk 'NR==$line_start, NR==$line_end' file
Cela ne veut pas imprimer quoi que ce soit. Il ne marche pas accrocher, va juste sur la ligne suivante.
J'ai fait des recherches certains des problèmes similaires, et a vu des gens utiliser l'option-v. Suis-je censé utiliser qu'ici, leurs situations étaient pour les plus grands scripts awk.
Par ailleurs, je suis en utilisant Kornshell
Merci!
OriginalL'auteur user1639103 | 2012-08-31
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs problèmes avec votre script. Le problème immédiat est que dans le deuxième appel à awk, vous utilisez des guillemets simples autour du scénario, de sorte
$line_start
et$line_end
sont des variables développé par le shell, ils sont passés littéralement, comme une partie du script awk. Vous pouvez résoudre ce problème en utilisant des guillemets à la place.Cela ne fonctionne que parce que
$line_start
et$line_end
sont des nombres. Si ils étaient les chaînes de caractères, vous ne pouviez pas faire cela, parce que les valeurs des variables shell finissent par être analysé par awk dans le cadre de awk code, pas comme des chaînes de caractères. En général, pour passer d'une chaîne à un script awk, vous pouvez utiliser l'idiome avec-v
de définir awk variables avec le même nom que les variables shell (ou avec d'autres noms, si vous préférez):Il y a plus de problèmes avec votre script.
/regex/
, puis$line_start
contiendra une liste des numéros de ligne. Le shell va se plaindre d'une erreur de syntaxe sur lelet
ligne.Si vous souhaitez afficher 5 lignes à la suite d'un match, faire le comptage à l'intérieur de awk.
Si vous souhaitez uniquement afficher le premier bloc identique, sortie une fois
show_lines
atteint 0.OriginalL'auteur Gilles
Vous pouvez utiliser sed pour cela:
Ou de modifier le awk solution:
Un autre awk solution
(s.awk)
:utilisation:
quelle est l'erreur?
Dans la plupart des cas, dans le code que vous avez posté,
if
n'est pas nécessaire. Il suffit de mettre la condition en dehors de l'action du bloc. C'est ce que l'OP a essayé de faire et ce que Gilles ne dans sa réponse.Merci beaucoup les gars! Je comprends beaucoup plus maintenant!
OriginalL'auteur perreal