J'essaie d'imprimer la ligne correspondante et la 4ème ligne de la ligne correspondante (ligne contenant l'expression que je recherche).
J'utilise le code suivant:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Mais cela n'imprime que la ligne correspondante.
Cela imprime uniquement la 4ème ligne.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Je dois imprimer à la fois la ligne correspondante et la 4e ligne uniquement.
shell-script
debal
la source
la source
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
fait exactement ce que vous voulez, à moins que je ne vous comprenne mal</td>
qui n'est pas la 4ème ligneRéponses:
En awk, vous le feriez comme suit
ou
Explication
La première solution trouve toutes les lignes qui correspondent
pattern
. Lorsqu'il trouve une correspondance, il stocke le numéro d'enregistrement (NR
) dans le tableaunr
. Il stocke également le 4ème enregistrementNR
dans le même tableau. Cela se fait par lenr[NR+4]
. Chaque enregistrement (NR
) est ensuite vérifié pour voir s'il est présent dans lenr
tableau, si c'est le cas, l'enregistrement est imprimé.La deuxième solution fonctionne essentiellement de la même manière, sauf lorsqu'elle rencontre la
pattern
ligne imprimée, puis stocke le 4e enregistrement devant lui dans le tableaunr
, puis passe à l'enregistrement suivant. Ensuite, lorsque vousawk
rencontrez ce 4ème enregistrement, leNR in nr
bloc sera exécuté et imprimera cet enregistrement +4 par la suite.Exemple
Voici un exemple de fichier de données,
sample.txt
.En utilisant la 1ère solution:
Utilisation de la 2ème solution:
la source
awk
raccourcis ici, pourriez-vous ajouter une courte explication (des choses comme l'impression étant impliquée dans awk et que les tableaux sont associatifs, etc.)?J'ajoute simplement une suppression des lignes appropriées, avant l'impression
{ 3,5d ; p }
.la source
sed: -e expression #1, char 18: unknown option to
s'`Vous pouvez essayer l'
-A
option avecgrep
, qui spécifie le nombre de lignes à imprimer après la ligne correspondante. Ajoutez cecised
et vous obtiendrez les lignes requises.grep -A 4 pattern input.txt | sed -e '2,4d'
En utilisant
sed
, nous supprimons le de la deuxième ligne jusqu'à la quatrième.la source
pattern
dans le fichier.Voici un moyen en Perl qui peut gérer un nombre arbitraire de lignes correspondantes:
En Perl. la variable spéciale
$.
est le numéro de ligne actuel. Ainsi, chaque fois que je trouve une ligne correspondantepattern
, je l'imprime et enregistre son numéro de ligne sous$c
. J'imprime ensuite à nouveau lorsque le numéro de ligne actuel est 4 de plus que celui imprimé précédemment.la source
Vous faites essentiellement une recherche et un remplacement. Vous pouvez ajouter juste une trouvaille dans la même commande et elle imprimera les deux :)
la source