0
votes

Comment supprimer des lignes après la première vérification des 3 lignes suivantes

J'ai un fichier texte similaire à ce xxx

Ceci est trafic réseau et la première partie est un horodatage tandis que les deux suivants sont envoyés et reçus du trafic. Le troisième est un zéro que je ne sais pas pourquoi existe-t-il.
Mon objectif est donc de garder uniquement les lignes qui ont au moins une valeur de trafic envoyé / recevoir et de supprimer également le troisième 0 à chaque fois. Donc, je vais avoir un résultat comme celui-ci. xxx

a essayé d'utiliser AWK dans le sens de la vérification de la longueur de la ligne de courant et si la ligne est inférieure à 8 caractères, imprimez cette ligne et le prochain 2. mais depuis. Le fichier n'a pas toujours au moins 2 valeurs après que l'horodatage ne fonctionne pas correctement.


5 commentaires

J'ai essayé des choses similaires à awk -f, "longueur (1 $) <8 {imprimé f; imprimer; getline; impression} {f = 1 $} ' de sorte qu'il imprimerait l'horodatage avec les 2 lignes suivantes. Mais puisque le fichier n'est pas cohérent, cela ne fonctionne pas correctement.


Veuillez ajouter pourquoi les lignes 00: 00: 26.792 alors 0 ne sont pas là dans votre sortie attendue, veuillez éditer votre question une fois.


@ RavinderSingH13 Il n'est pas souhaité de produire car ils n'offrent aucune information supplémentaire.


Alors s'il vous plaît mentionner la logique derrière la suppression de la sortie attendue aussi?


@ Ravindersingh13 Je ne suis pas vraiment en train de suivre ce que vous dites ici. La logique derrière la suppression de la sortie attendue est qu'ils n'offrent pas d'informations supplémentaires comme je l'ai dit ci-dessus. Je n'ai besoin que de garder les lignes qui ont au moins une valeur de trafic reçu / envoyé. Néanmoins, merci pour votre temps pour essayer de m'aider.


3 Réponses :


2
votes
awk '
/[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  if (NR > 1) p() 
  i = 0
}
{ buf[++i] = $0 }
END { p() }
function p() {
  if (buf[2] || buf[3]) {
    print buf[1]
    print buf[2]
    print buf[3]
  }
  delete buf
}' file
p is a function that prints buffered lines if 2nd and 3rd of them are not empty or zero, and clears the buffer. It is called whenever a timestamp is seen (and it's not the first line in the file) and when EOF is hit. So the script above basically buffers lines between two timestamps, and if they meet the criteria that there should be at least two lines after timestamp, and they shouldn't be zero, prints them.

1 commentaires

Si vous avez du temps, veuillez l'expliquer brièvement.



0
votes

Ceci pourrait fonctionner pour vous (GNU SED):

sed '/:/!{H;$!d};x;/\n.*\n.*\n/{/\n0\n0\n0/!s/\n0$//p};x;h;d' file


0 commentaires

0
votes

Si vous souhaitez omettre toutes les 4e lignes, ce script AWK pour atteindre cet objectif:

awk 'RN % 4{print}' input.txt


0 commentaires