Linux: remplacer un retour chariot par un espace (AWK) - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 15-05-2008 à 06:29:57
personne?
Marsh Posté le 15-05-2008 à 08:25:47
Humm avec une regexp c'est pas très dur je pense la find e ligne étant un $ ...
Mais faudrait fait un "cat <fichier> |sed -e s/$/ / | awk ..."
Ligne probablement à corriger mais qui peu te donner une idée de base
Marsh Posté le 15-05-2008 à 09:10:34
hmmmmm déja je passe par un tail -f car il faut que cela soit en continu, le sed heu.... je pige pas trop car des fois tu l'as, des fois tu ne l'as pas donc.....
Je vais regarder de plus pres mais j'aimerais l'integrer directement dans mon awk.
Merci
Marsh Posté le 15-05-2008 à 11:07:26
matafan > merci mais heu... tu pourrais m'expliquer please, j'avous que la j'ai un peu de mal a comprendre le fonctionnement.
Marsh Posté le 15-05-2008 à 11:18:41
ah c'est bon je crois comprendre, tu lui dis que si le nombre de champ est égale a 20 alors tu cumule les 2 lignes, j'ai tout bon??
Marsh Posté le 15-05-2008 à 12:48:12
Si la ligne a 20 champs, on l'affiche avec un espace au lieu du retour de ligne final (d'où le printf au lieu de print, car printf, au contraire de print, n'ajoute pas de retour à la ligne). Sinon (c'est un "sinon" à cause du next) on affiche simplement la ligne.
Marsh Posté le 15-05-2008 à 14:01:58
ok mais désolé cela ne fonctionne pas, le résultat est celui ci:
D|1000000038570380.12345.20080514000211507|1000000038570380.12345.20080514000211507|1|1000000038570380|12345|blablabla|badada|tictictic|1||tictactouc|V01L16|20080514000202000|20080514000211507|640||||tadada 2
Marsh Posté le 15-05-2008 à 14:19:14
bon par contre si je fais cela:
awk -F '|' ' NF<40 { printf("%s ", $0); next } {print NR}'
j'ai en réponse:
D|1000000038570380.12345.20080514000211507|1000000038570380.12345.20080514000211507|1|1000000038570380|12345|blablabla|badada|tictictic|1||tictactouc|V01L16|20080514000202000|20080514000211507|640||||tadada|0|1|tadada|3|3|1|360|OK||REVERSE|1||32008001|947183522|||||35991501|0 2
Le 2 representant l'autre ligne, celle ci par contre devrait etre a la ligne et non sur la meme ligne
Marsh Posté le 15-05-2008 à 15:25:40
Ben écoute chez moi ça marche avec l'exemple que tu as donné, alors soit ton exemple n'est pas bon, soit tu as mal expliqué ce que tu voulais faire, soit j'ai mal compris ce que tu voulais faire, soit t'a fait une connerie.
$ cat txt |
Edit : bon sur la sortie que je donne on voit pas que ça marche parce que le brower coupe sur l'espace entre tadada et badada, mais c'est bien un espace, pas un retour à la ligne.
Marsh Posté le 15-05-2008 à 15:57:44
Ben heu... je viens de réessayer et non désolé cela ne fonctionne pas, voici un exemple concret:
fichier de base:
D|258720649362743.61800.20080515112643168|258720649362743.61800.20080515112643168|1|258720649362743||serv|||2||hub_ri|V01L16| 20080515112641000|20080515112643168|190||||0561080709|0|1|0561080709|1|1|1|50|OK||REVERSE_CHARGED|1||0003|948082733||||||0
D|1000000038557513.32008.20080515112713778|1000000038557513.32008.20080515112713778|1|1000000038557513||serv|||1||hub_r n|V01L16|20080515112727000|20080515112713778|2100||||La gare
Paris 16|0|1|La gare Paris 16|27|27|1|1580|OK||REVERSE_CHARGED|1||001|948083251|||||35703600|0
D|333780802055.20080515112802549|333780802055.32008.20080515112802549|1|333780802055|32008|serv|||3||hub_rn|V01L16|20080 515112802000|20080515112802549|660||||Entreprises 42 cuinzier |0|1|Entreprises 42 cuinzier|8|8|1|330|OK||REVERSE_CHARGED|1||002|948083981||||||0
D|377876107718.20080515111747002|377876107718.20080515111747002|1|377876107718||serv|||3||hub_mt|V01L16|20080515111745000|20080515111747002|1020||||Tailleur
Saint varent 79330|0|1|Tailleur Saint varent 79330|0|0|0|900|OK|MT_ERR_NOREPONSE|REVERSE_CHARGED|1||002|948073640||||||0
D|258720649362743.61800.20080515112643168|258720649362743.20080515112643168|1|258720649362743||serv|||2||hub_ri|V01L16| 20080515112641000|20080515112643168|190||||0561080709|0|1|0561080709|1|1|1|50|OK||REVERSE_CHARGED|1||00003|948082733||||||0
En gras les 2 lignes qui ne vont pas
Résultat avec ton awk:
1
D|1000000038557513.20080515112713778|1000000038557513.32008.20080515112713778|1|1000000038557513||serv|||1||hub_r n|V01L16|20080515112727000|20080515112713778|2100||||La gare Paris 16|0|1|La gare Paris 16|27|27|1|1580|OK||REVERSE_CHARGED|1||001|948083251|||||35703600|0 4
D|377876107718.20080515111747002|377876107718.20080515111747002|1|377876107718||serv|||3||hub_mt|V01L16|20080515111745000|20080515111747002|1020||||Tailleur Saint varent 79330|0|1|Tailleur Saint varent 79330|0|0|0|900|OK|MT_ERR_NOREPONSE|REVERSE_CHARGED|1||002|948073640||||||0 7
j'ai remplacé print par print NR (cela ne change rien avec ou sans).
En gras la nouvelle ligne, alors que celle ci devrait etre a la ligne et non a un espace de sa précédente.
Merci en tous cas de ton aide
Marsh Posté le 15-05-2008 à 17:53:46
cat log.txt | nawk -F'|' '
BEGIN { flag="ok"; }
NF<40 { flag="tronque" ; printf("%s ", $0); }
NF==40 {if (flag=="tronque" ) {print("\n"$0); flag="ok" ;} else print $0;}'
edit: petite erreur
Marsh Posté le 15-05-2008 à 17:56:07
Bon écoute je comprend rien à ce que tu as et à ce que tu veux. Met un exemple de fichier quelque part sur un ftp, et met aussi le fichier que tu voudrais en sortie. Là ça s'affiche mal et tu ne t'exprime pas très clairement, et au final on comprend rien.
Marsh Posté le 15-05-2008 à 19:52:15
matafan> je réexplique, j'ai un fichier qui est comme cela (je vais prendre plus simple)
AA|BB|CC|DD|EE|FF
des fois je me retrouve avec
AA|BB|CC|D
D|EE|FF
Moi je veux qu'il n'y ai toujours que : AA|BB|CC|DD|EE|FF
Donc mon log est:
AA|BB|CC|DD|EE|FF
AA|BB|CC|D
D|EE|FF
AA|BB|CC|DD|EE|FF
Comment obtenir:
AA|BB|CC|DD|EE|FF
AA|BB|CC|DD|EE|FF
AA|BB|CC|DD|EE|FF
Avec ton awk j'ai:
AA|BB|CC|DD|EE|FF
AA|BB|CC|DD|EE|FF AA|BB|CC|DD|EE|FF
J'espere avoir été plus claire
jc the great > c'est quoi nawk???? la différence avec awk juste pour ma culture perso la
Sinon merci a toi j'essayerais demain
Marsh Posté le 15-05-2008 à 20:13:55
Je vais etre meme plus claire parceque je crois que je pars dans un truc qui ne vas pas fonctionner au final.
je reprend l'exemple du dessus
Mon fichier est donc comme ceci:
AA|BB|CC|DD|EE|FF
AA|BB|CC|D
D|EE|FF
AA|BB|CC|DD|EE|FF
Moi je le ressort sous cette forme (genre tableau):
ID: Serv: Entreprise: Bureau:
--- ----- ------------ --------
BB CC DD FF
Quand il y a un saut de ligne dans mon fichier cela me ressort:
ID: Serv: Entreprise: Bureau:
--- ----- ------------ --------
BB CC D
Donc je pensais d'abord remettre le tout sur une seul ligne, puis retravailler sur cette ligne, mais je crois pas que ce soit l'idéal dans mon cas, je ne fais pas un cat mais un tail -F, le "tableau" étant alimenté en permanence, c'est une vue direct sur le fichier et en continue.
Bon si vous ne comprenez pas, ce n'est pas grave, l'aide apporté devrait je pense m'aider bien comme il faut
Marsh Posté le 15-05-2008 à 23:30:21
Ecoute exover je comprend pas comment tu te débrouille, mais mon awk fonctionne parfaitement :
$ cat txt |
Edit : nawk c'est la version de awk qui se limite à se qui est standard. Sous linux awk est en fait gawk, qui contient des extensions qui ne sont pas dans le awk de base.
Marsh Posté le 16-05-2008 à 08:39:50
Le probléme c'est qu'il a pas un fichier si j'ai bien compris mais un flux
C'est probablement ça qui l'empêche de marcher, et ma solution aussi
Marsh Posté le 16-05-2008 à 09:28:57
Avoir un flux ça ne change rien.
En fait je crois que j'ai compris : il doit avoir un fichier au format dos (donc avec 0x0d 0x0a pour les retour chariot), et donc awk merde avec les retours chariot.
Marsh Posté le 16-05-2008 à 09:41:55
hrolf > ben je l'ai dis au début que c'etaiut un tail -F mais il est vrai que je n'ai pas reellement indiqué ce que je cherchais
matafan> ben la je pige plus rien, ce matin, je lance le code au dessus et cela fonctionne!!!! moi plus rien capter
Marsh Posté le 16-05-2008 à 09:42:37
matafan > non non c'est un flux unix mais j'ai fais le test en cat pas en direct sur le flux.
Marsh Posté le 14-05-2008 à 16:50:04
Bonsoir,
Voila j'ai un fichier composé de cette sorte:
D|1000000038570380.12345.20080514000211507|1000000038570380.12345.20080514000211507|1|1000000038570380|12345|blablabla|badada|tictictic|1||tictactouc|V01L16|20080514000202000|20080514000211507|640||||tadada|0|1|tadada|3|3|1|360|OK||REVERSE|1||32008001|947183522|||||35991501|0
Des fois le champs en gras est composé comme ca :
D|1000000038570380.12345.20080514000211507|1000000038570380.12345.20080514000211507|1|1000000038570380|12345|blablabla|badada|tictictic|1||tictactouc|V01L16|20080514000202000|20080514000211507|640||||tadada
badada|0|1|tadada|3|3|1|360|OK||REVERSE|1||32008001|947183522|||||35991501|0
Donc un retour chariot est veu se glissé par la, j'aimerais intégrer dans mon awk la fonction de remplacement du retour chariot par un espace mais UNIQUEMENT sur ce champs (le champs $20 en faites).
Je n'y arrive pas, pouvez vous donc m'aidez.
Merci a vous
Message édité par exover le 14-05-2008 à 16:51:41
---------------
Spidercochon ! Spidercochon ! Il peut marcher au plafond. Est-ce qu’il peut faire une toile, bien sûr que non c’est un cochon, prends garde Spidercochon est là !