Suppression ligne dans fichier si valeur superieur à ....
lsda26
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Voici un extrait de mon fichier à traiter:
Je souhaite supprimer toute les lignes de ce fichier contenant la chaine "time=" et ayant une valeur qui suit inferieur à 20 (ms)
Merci
J'arrive à recupérer les valeurs en miliseconde avec:
cat $fichier | grep "time=" | cut -d "=" -f 2 | cut -d " " -f 1
mais je n'arrive pas à faire un test de cette valeur pour chaque ligne du fichier et de supprimer la ligne correspondante si le test et positif.
Merci pour votre aide!
Voici un extrait de mon fichier à traiter:
--- 137.121.161.201 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 10001ms rtt min/avg/max/mdev = 0.424/0.469/0.534/0.041 ms vendredi 26 avril 2013, 12:38:15 (UTC+0200) ping du switch 137.121.161.201 à partir de HP-73 port 20 PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data. 64 bytes from 137.121.161.201: icmp_req=1 ttl=64 time=0.455 ms 64 bytes from 137.121.161.201: icmp_req=2 ttl=64 time=0.470 ms 64 bytes from 137.121.161.201: icmp_req=3 ttl=64 time=0.476 ms 64 bytes from 137.121.161.201: icmp_req=4 ttl=64 time=0.562 ms 64 bytes from 137.121.161.201: icmp_req=5 ttl=64 time=0.475 ms 64 bytes from 137.121.161.201: icmp_req=6 ttl=64 time=27.8 ms 64 bytes from 137.121.161.201: icmp_req=7 ttl=64 time=28.2 ms 64 bytes from 137.121.161.201: icmp_req=8 ttl=64 time=94.2 ms 64 bytes from 137.121.161.201: icmp_req=9 ttl=64 time=123 ms 64 bytes from 137.121.161.201: icmp_req=10 ttl=64 time=112 ms 64 bytes from 137.121.161.201: icmp_req=11 ttl=64 time=148 ms --- 137.121.161.201 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 10004ms rtt min/avg/max/mdev = 0.455/48.829/148.134/55.706 ms vendredi 26 avril 2013, 12:38:26 (UTC+0200) ping du switch 137.121.161.201 à partir de HP-73 port 20 PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data. 64 bytes from 137.121.161.201: icmp_req=1 ttl=64 time=153 ms 64 bytes from 137.121.161.201: icmp_req=2 ttl=64 time=168 ms 64 bytes from 137.121.161.201: icmp_req=3 ttl=64 time=220 ms 64 bytes from 137.121.161.201: icmp_req=4 ttl=64 time=237 ms 64 bytes from 137.121.161.201: icmp_req=5 ttl=64 time=163 ms 64 bytes from 137.121.161.201: icmp_req=6 ttl=64 time=233 ms 64 bytes from 137.121.161.201: icmp_req=7 ttl=64 time=235 ms 64 bytes from 137.121.161.201: icmp_req=8 ttl=64 time=172 ms 64 bytes from 137.121.161.201: icmp_req=9 ttl=64 time=230 ms 64 bytes from 137.121.161.201: icmp_req=10 ttl=64 time=191 ms 64 bytes from 137.121.161.201: icmp_req=11 ttl=64 time=194 ms
Je souhaite supprimer toute les lignes de ce fichier contenant la chaine "time=" et ayant une valeur qui suit inferieur à 20 (ms)
Merci
J'arrive à recupérer les valeurs en miliseconde avec:
cat $fichier | grep "time=" | cut -d "=" -f 2 | cut -d " " -f 1
mais je n'arrive pas à faire un test de cette valeur pour chaque ligne du fichier et de supprimer la ligne correspondante si le test et positif.
Merci pour votre aide!
A voir également:
- Suppression ligne dans fichier si valeur superieur à ....
- Forcer suppression fichier - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
4 réponses
Bonjour,
Je pense que ce serait beaucoup plus simple avec awk ou un script shell. Sur le principe il te faut extraire la valeur avec une expression régulière et la tester. En fonction du résultat tu réécris ou non la ligne.
Bonne chance
Je pense que ce serait beaucoup plus simple avec awk ou un script shell. Sur le principe il te faut extraire la valeur avec une expression régulière et la tester. En fonction du résultat tu réécris ou non la ligne.
Bonne chance
Je suis pas un pro de awk malheureusement.
J'ai réussit à filtrer ce que je voulais avec 3 sed successif:
sed -i '/time=[0-1][0-9]\.[0-9]\ ms$/d' $fichier
sed -i '/time=0\.[0-9][0-9][0-9]\ ms$/d' $fichier
sed -i '/time=[0-9].[0-9][0-9]\ ms$/d' $fichier
Mais maintenant je me retrouve avec des paragraphes sans un seul ping.
du type:
donc je souhaite supprimer les 6 lignes précedante si après "PING 137.121.161.201 (137.121.161.201)" la ligne est "vide"
J'ai réussit à filtrer ce que je voulais avec 3 sed successif:
sed -i '/time=[0-1][0-9]\.[0-9]\ ms$/d' $fichier
sed -i '/time=0\.[0-9][0-9][0-9]\ ms$/d' $fichier
sed -i '/time=[0-9].[0-9][0-9]\ ms$/d' $fichier
Mais maintenant je me retrouve avec des paragraphes sans un seul ping.
du type:
--- 137.121.161.201 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 10001ms rtt min/avg/max/mdev = 0.456/0.593/1.037/0.172 ms vendredi 26 avril 2013, 11:26:18 (UTC+0200) ping du switch 137.121.161.201 à partir de HP-73 port 20 PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data. --- 137.121.161.201 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 9997ms rtt min/avg/max/mdev = 0.457/0.550/0.868/0.120 ms vendredi 26 avril 2013, 11:26:28 (UTC+0200) ping du switch 137.121.161.201 à partir de HP-73 port 20 PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.
donc je souhaite supprimer les 6 lignes précedante si après "PING 137.121.161.201 (137.121.161.201)" la ligne est "vide"
Salut,
awk -F'[ =]' '$10 > 20 { print }' fichier
merci mais j'aimerai n'effacer les lignes
seulement si il n'y a pas de ping supérieur à 20ms, donc supprimer ces ligne si il n'y a pas de ping après la ligne "PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data."
--- 137.121.161.201 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 9997ms rtt min/avg/max/mdev = 0.457/0.550/0.868/0.120 ms vendredi 26 avril 2013, 11:26:28 (UTC+0200) ping du switch 137.121.161.201 à partir de HP-73 port 20 PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.
seulement si il n'y a pas de ping supérieur à 20ms, donc supprimer ces ligne si il n'y a pas de ping après la ligne "PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data."
hello
awk -F "[ =]+" '/time=/ && $(NF-1)<20.0 {next} {print}' fichier
Merci pour la commande awk!
Par contre je retrouve comme à la suite de mes commandes sed, avec des paragraphes sans un seul ping. Donc quand un paragraphe n'a pas de ping j'aimerais le supprimer. Donc supprimer de la ligne "--- 137.121.161.201 ping statistics ---" à la ligne "PING 137.121.161.201 (137.121.161.201)" pour ne garder que des paragraphe avec des pings et ainsi ne garder que l'essentiel de mon fichier de sortie.
Par contre je retrouve comme à la suite de mes commandes sed, avec des paragraphes sans un seul ping. Donc quand un paragraphe n'a pas de ping j'aimerais le supprimer. Donc supprimer de la ligne "--- 137.121.161.201 ping statistics ---" à la ligne "PING 137.121.161.201 (137.121.161.201)" pour ne garder que des paragraphe avec des pings et ainsi ne garder que l'essentiel de mon fichier de sortie.