De stocker une copie de chaque ligne dans une variable temporaire, et ensuite utiliser à la FIN du bloc à traiter.
Utiliser le système de commande à exécuter "wc-l | getline" dans le bloc BEGIN pour obtenir le nombre de lignes dans le fichier, puis de compter la valeur.
Vous pourriez avoir à jouer avec le #2 un peu pour le faire fonctionner, mais il devrait fonctionner. Son été un moment depuis que j'ai fait tout awk.
Beurk, je déteste vraiment que l'option 2. Toutefois, l'option 1 est la façon de le faire. +1 pour l'option 1. Non! Ne faites pas l'option "1", ce qui est un gaspillage de ressources et ne font pas l'option "2" car il est tout simplement pas la bonne manière d'utiliser les wc dans un tel scénario, et présente toutes les getline mises en garde. Si le fichier est de rester la même longueur de la ligne, vous pourriez faire RECORDS=$(cat myfile | wc -l); awk 'NR == '${RECORDS}' {print "Last Line"}' myfile. Hey, au point lorsque vous choisissez AWK, vous avez déjà fait passé l'élégance. 🙂
Spécial END modèle correspond seulement après la fin de l'entrée de tous les. Noter que ce modèle ne peut pas être combiné avec tout autre motif.
Plus utile est sans doute le getline pseudo-fonction réinitialise $0 à la ligne suivante et retour 1, ou, dans le cas des expressions du FOLKLORE return 0! Je pense que c'est ce que vous voulez.
Par exemple:
awk '{ if(getline == 0) { print "Found EOF"} }'
Si vous êtes seulement de traitement d'un fichier, ce serait l'équivalent:
awk 'END { print "Found EOF" }'
En fait, mon premier exemple devrait lire: awk '{ while(getline == 1) {}; print "Trouvés EOF" }' Notez que getline sera de retour -1 si il y a une erreur. Vrai, j'ai oublié de mentionner que, mais si il est de la lecture à partir d'un tas de fichiers statiques, ce qui est peu probable, mais alors je suppose que ça dépend beaucoup du contexte de son script. J'ai juste essayé cette solution, et il a travaillé pour moi. Merci! Si on a affaire à deux fichiers, puis on peut faire cmd="cat file2"; while(condition) {if(cmd | getline line2 == 0) break;
Détecter les expressions du FOLKLORE n'est pas trop fiable lorsque plusieurs fichiers sont sur la ligne de commande. Détecter le début du fichier est plus fiable.
Pour ce faire, le premier fichier est spécial et que nous ignorons le FNR==1.
Après le premier fichier puis FNR==1 devient la fin du fichier précédent. last_filename a toujours le nom de fichier que vous traitez.
Faire de votre fichier de traitement après l'autre.
Faire votre EOF traitement à l'intérieur de l'autre bloc, ET à la FIN du bloc.
Pour plusieurs ensembles de fichiers, le bloc else est exécuté EOF pour tous, mais le dernier fichier. Le dernier fichier est exécuté à la FIN du bloc.
Pour seul fichier jeux, le bloc else n'a pas été exécuté, et la FIN du bloc est exécuté.
Je ne suis même pas sûr de savoir comment classer cette "solution"
{
t = lastline
lastline = $0
$0 = t
}/test/{print"line <" $0 "> had a _test_"}END{# now you have "lastline", it can't be processed with the above statements# ...but you can work with it here}
La chose cool à propos de ce hack est qu'en attribuant à $0, tous les autres déclarative des modèles et des actions de travail, une ligne de retard. Vous ne pouvez pas obtenir à travailler pour le END, même si vous mettez le END sur le dessus, mais vous ne avoir le contrôle sur la dernière ligne et vous n'avez rien fait d'autre.
Sera-ce seulement de détecter la dernière ligne du dernier fichier dans le awk entrée de la liste de fichiers?
gawk la mise en œuvre a règle spéciale appelée ENDFILE qui sera déclenchée après le traitement de chaque fichier dans la liste d'arguments. Cela fonctionne:
Un moyen facile est de lancer le fichier par le biais d'un intermédiaire sed script, qui met un 0 sur tous les non-dernière ligne, et de 1 sur le dernier.
cat input_file | sed 's/^/0/;$s/0/1/'| awk '{LST=/^1/;$0=substr($0,2)}
... your awk script in which you can use LST to check for the
... last line.'
Première version à l'aide de sed que j'ai trouvé qui fonctionne réellement, et dans mon cas, je ne voulais pas utiliser awk.
Vous avez deux options, deux types de désordre.
Vous pourriez avoir à jouer avec le #2 un peu pour le faire fonctionner, mais il devrait fonctionner. Son été un moment depuis que j'ai fait tout awk.
Non! Ne faites pas l'option "1", ce qui est un gaspillage de ressources et ne font pas l'option "2" car il est tout simplement pas la bonne manière d'utiliser les wc dans un tel scénario, et présente toutes les getline mises en garde.
Si le fichier est de rester la même longueur de la ligne, vous pourriez faire
RECORDS=$(cat myfile | wc -l); awk 'NR == '${RECORDS}' {print "Last Line"}' myfile
. Hey, au point lorsque vous choisissez AWK, vous avez déjà fait passé l'élégance. 🙂OriginalL'auteur SDGator
Spécial
END
modèle correspond seulement après la fin de l'entrée de tous les. Noter que ce modèle ne peut pas être combiné avec tout autre motif.Plus utile est sans doute le
getline
pseudo-fonction réinitialise$0
à la ligne suivante et retour 1, ou, dans le cas des expressions du FOLKLORE return 0! Je pense que c'est ce que vous voulez.Par exemple:
Si vous êtes seulement de traitement d'un fichier, ce serait l'équivalent:
Notez que getline sera de retour -1 si il y a une erreur.
Vrai, j'ai oublié de mentionner que, mais si il est de la lecture à partir d'un tas de fichiers statiques, ce qui est peu probable, mais alors je suppose que ça dépend beaucoup du contexte de son script.
J'ai juste essayé cette solution, et il a travaillé pour moi.
Merci! Si on a affaire à deux fichiers, puis on peut faire
cmd="cat file2"; while(condition) {if(cmd | getline line2 == 0) break;
OriginalL'auteur uriel
Ce sont les seuls judicieux de faire ce que vous voulez, dans l'ordre du meilleur au pire:
OriginalL'auteur Ed Morton
Détecter les expressions du FOLKLORE n'est pas trop fiable lorsque plusieurs fichiers sont sur la ligne de commande. Détecter le début du fichier est plus fiable.
Pour ce faire, le premier fichier est spécial et que nous ignorons le FNR==1.
Après le premier fichier puis FNR==1 devient la fin du fichier précédent. last_filename a toujours le nom de fichier que vous traitez.
Faire de votre fichier de traitement après l'autre.
Faire votre EOF traitement à l'intérieur de l'autre bloc, ET à la FIN du bloc.
Pour plusieurs ensembles de fichiers, le bloc else est exécuté EOF pour tous, mais le dernier fichier. Le dernier fichier est exécuté à la FIN du bloc.
Pour seul fichier jeux, le bloc else n'a pas été exécuté, et la FIN du bloc est exécuté.
OriginalL'auteur rickfoosusa
Je ne suis même pas sûr de savoir comment classer cette "solution"
La chose cool à propos de ce hack est qu'en attribuant à
$0
, tous les autres déclarative des modèles et des actions de travail, une ligne de retard. Vous ne pouvez pas obtenir à travailler pour leEND
, même si vous mettez leEND
sur le dessus, mais vous ne avoir le contrôle sur la dernière ligne et vous n'avez rien fait d'autre.OriginalL'auteur DigitalRoss
gawk la mise en œuvre a règle spéciale appelée
ENDFILE
qui sera déclenchée après le traitement de chaque fichier dans la liste d'arguments. Cela fonctionne:plus de détails, vous pouvez trouver ici>>
OriginalL'auteur tworec
Un moyen facile est de lancer le fichier par le biais d'un intermédiaire
sed
script, qui met un 0 sur tous les non-dernière ligne, et de 1 sur le dernier.OriginalL'auteur fcr
Pour détecter la dernière ligne de chaque fichier dans la liste d'arguments
le suivant fonctionne très bien:
OriginalL'auteur sgr
Hmm le awk
END
variable indique si vous avez déjà atteint leEOF
. N'est pas vraiment beaucoup de vous aider à vous je supposeOriginalL'auteur jitter
vous pouvez essayer ceci:
OriginalL'auteur user3859311
Une solution portable est fourni dans le gawk manuel de l'utilisateur, bien que, comme mentionné dans une autre réponse, gawk lui-même a BEGINFILE et ENDFILE.
OriginalL'auteur Matt Wenham