#0 -1 » Extraire une variable d'un fichier texte désordonné » Le 23/08/2018, à 10:26
- Link_Octree
- Réponses : 6
Bonjour,
Je dispose d'un fichier texte assez désordonné qui comporte la variable suivante
data-preconnect-urls="une_url"
:
Je voudrais extraire le contenu se trouvant entre les deux guillemets mais je n'y parvient pas. J'ai essayé avec cut mais il supporte un seul charactère comme délimiteur. J'ai donc essayé de tricher avec sed en remplacant "data-preconnect-urls=" par un unique charactère que je ne pense pas trouver à d'autre endroits dans ce fichier, le sigle £ par exemple. Celà ne fonctionne toujours pas car sed détecte £ comme plusieurs charactères.
J'ai également fait plusieurs essais infructueux avec grep.
Auriez-vous une idée de comment je pourrais m'y prendre s'il vous plait? Idéalement j'aimerais comprendre le code afin de pouvoir l'adapter moi même tout seul à d'autres situations similaires.
Cordialement,
#1 Re : -1 » Extraire une variable d'un fichier texte désordonné » Le 24/08/2018, à 14:28
- Link_Octree
- Réponses : 6
Bonjour,
Tu peux essayer ceci :sed -nr 's/.*\bdata-preconnect-urls="([^"]+)".*/\1/p' fichier
Ton code me semble le plus simple, serait-il possible de l'adapter pour couvrir les cas cette variable apparait plusieurs fois dans mon fichier, avec plusieurs URL différentes? Merci beaucoup!
#2 -1 » Restreindre grep à une seule colonne ? » Le 24/05/2017, à 14:18
- Link_Octree
- Réponses : 4
Bonjour,
Je dispose du fichier-type.txt suivant:
23 May 2017 09:27:16,8651,81.***.**.***,BT,BT,United Kingdom,DORSET,BRIDPORT,WINDOWS NT 10.0,768X1366,EN-US,CHROME,58.0.3029.110,GMT+00:00,,A,2
23 May 2017 09:23:14,79617154,94.**.***.**,OTENET S.A.,OTENET S.A.,Greece,DRAMA,DRÁMA,WINDOWS NT 6.1,1050X1680,EL,CHROME,58.0.3029.110,GMT+02:00,,C,1
23 May 2017 09:01:04,127,94.***.**.***,OTENET S.A.,OTENET S.A.,Greece,ATTIKI,ATHENS,WINDOWS NT 6.1,1080X1920,EL,CHROME,58.0.3029.110,GMT+02:00,,G,1
Je voudrais "séparer" ce fichier selon la valeur du champ n°16. Ce champ peut avoir plusieurs valeurs possibles, listées dans mon fichier valeurs-possibles.txt
Le code devrait, je pense, être proche du suivant:
while read line; do
cat fichier-type.txt | grep "$line" > A.csv
done <valeurs-possibles.txt
Là où je bloque, c'est comment restreindre grep à une colonne spécifique (la 16 dans mon cas) ?
J'ai essayé pas mal de choses, y compris une adaptation du code suivant, sans succés:
awk -F, '$3 == 12' file.csv
Merci d'avance
#3 Re : -1 » Restreindre grep à une seule colonne ? » Le 25/05/2017, à 12:35
- Link_Octree
- Réponses : 4
Merci beaucoup, çà produit exactement le résultat que je voulais
Si ce n'est pas trop te demander, pourrais-tu expliquer un peu ta commande ? En particulier le -vval="$val" j'ai cru à une faute de frappe au début.
#4 -1 » Restreindre Grep à un terme exact ? » Le 09/08/2016, à 18:13
- Link_Octree
- Réponses : 3
Salut à tous,
Je voudrais grep un terme exact (ISP) dans un fichier.txt, j'ai essayé beaucoup de paramètres: -w ; -Fx ; entourer le mot clé de < > etc. mais aucun ne semble fonctionner dans mon cas. Soit la commande ne renvoit rien, soit elle renvoit les deux résultats.
Avez-vous une idée de comment résoudre celà ? J'aimerai une solution que je puisse réutiliser à la suite (ne pas contourner le problème en comptant le nombre de charactères par exemple).
Fichier.txt
ISP
ISP Org
Merci d'avance !
#5 Re : -1 » Restreindre Grep à un terme exact ? » Le 09/08/2016, à 18:30
- Link_Octree
- Réponses : 3
@MicP: Le terme recherché est bien "ISP", je pense que tu as répondu avant que j'ai eu le temps d'éditer.
Merci pour tes explications, çà a l'air de fonctionner
#6 -1 » [Bash] Restreindre sed ou awk à une colonne d'un fichier csv » Le 21/06/2016, à 16:58
- Link_Octree
- Réponses : 6
Salut à tous,
J'ai le fichier .csv suivant:
05/17/2016 15:37:47,102,11801
05/21/2016 13:45:53,79,116554
05/21/2016 22:03:26,3,9926911
Le second champ est un code numérique, j'aimerais remplacer sa valeur (via sed ou awk) par quelque chose de plus lisible ex:
05/17/2016 15:37:47,GOOGLE,11801
05/21/2016 13:45:53,MICROSOFT,116554
Pour celà, je cherche à resteindre l'exécution de SED ou d'AWK à cette seule colonne. J'avais pensé faire çà avec cut mais çà ne marche pas comme prévu.
Je suis tombé sur ce topic où quelqu'un cherchait à faire la même chose.
Malheureusement, je n'ai pas réussi à adapté le code proposé par un contributeur à mon cas:
awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'
J'ai remplacé les "@" par des virgules vu que ce sont mes séparateurs de champs à moi, et les "$3" par des "$2" vu que c'est la colonne qui m'intéresse à moi... sans succés jusque là.
Si vous pouviez y jeter un coup d'oeil, merci d'avance !
#7 Re : -1 » [Bash] Restreindre sed ou awk à une colonne d'un fichier csv » Le 21/06/2016, à 17:52
- Link_Octree
- Réponses : 6
Bonjour,
Dans ton exemple on pourrait juste faire ceci :
sed 's/,102,/,GOOGLE,/g;s/,79,/,MICROSOFT,/g'
Cordialement
Il peut arriver parfois, coïncidence assez courante, que le troisième champ soit égal au second, hors je ne veux pas remplacer le second champ (corrige moi si je me trompe, mais il me semble que ta commande ne prendrait pas en compte ce cas de figure).
@Watael: Les données de remplacement seraient soient stocké dans le script bash lui même, soit dans une base de données externe csv.
#8 -1 » [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom » Le 06/04/2015, à 11:12
- Link_Octree
- Réponses : 6
Hello,
Je dispose d'un dossier contenant plusieurs fichiers .csv nommés sous la forme Blablabla - Blablabla - 3101.csv.
Je souhaiterais renommer ces fichiers en ne conservant que les quatre derniers charactères précédent l'extension.
Même si c'est pas l'idéal, j'aimerais beaucoup faire celà via cut, que je connais un petit peu, et que je pourrais ainsi adapter dans d'autres scripts futurs.
J'aimerais ensuite inverser les deux premiers et les deux dernières charactères pour obtenir la date sous la forme US (mois/jour) du genre 0131.csv
Le bout de code auquel j'ai pensé et qui ne fonctionne pas est le suivant:
for file in /home/user/dossier
do
mv $file $file | cut -d"." -f1 | tail -c5
done
Merci beaucoup
#9 Re : -1 » [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom » Le 06/04/2015, à 12:20
- Link_Octree
- Réponses : 6
Merci du tuyau mais çà ne fonctionne pas: le script ne semble pas s'appliquer correctement au 4 derniers charactères du nom du fichier:
+ for file in '/home/user/dossier/*.csv'
++ basename PMT .csv
++ tail -c5
+ bsn=PMT
++ dirname PMT
+ drn=.
+ nom=TPM.csv
+ mv -i PMT ./TPM.csv
mv: impossible d'évaluer « PMT »: Aucun fichier ou dossier de ce type
#10 -1 » [Bash] Vérifier qu'un fichier ne contient pas un mot-clés » Le 28/11/2014, à 13:25
- Link_Octree
- Réponses : 4
Hello,
J'ai un fichier.txt qui est censé contenir un mot-clés. Il arrive parfois que ce mot-clés soit introuvable (quand le fichier a mal été téléchargé) je voudrais alors re-télécharger ce même fichier jusqu'à ce que le mot clés soit bel est bien présent dans le fichier.txt.
J'ai essayé BEAUCOUP de lignes de codes censées faire ceci, sans succés, je pense faire une erreur de syntaxe mais après une heure d'essais, je désespère :S
Voilà mon code actuel:
while [ grep -v -q "MotCle" prefixe_${nom_fichier}.html ]
do
wget ...
done
Si une erreur vous saute au yeux, merci de m'en faire part.
#11 Re : -1 » [Bash] Vérifier qu'un fichier ne contient pas un mot-clés » Le 02/12/2014, à 10:46
- Link_Octree
- Réponses : 4
Merci pour votre aide Sciensous & sputnick
Je voudrais ajouter une sécurité pour sortir de la boucle et abandonner si au bout de disons 5 tentatives le mot clé n'est toujours pas trouvé dans le fichier téléchargé.
J'ai une vague idée de comment interfacer çà avec mon code, mais encore une fois je bloque sur la syntaxe depuis plus de demi heure, j'ai essayé avec let, avec un exemple int, pas moyen d'arriver à quelque chose :S
let "compteur=0"
until grep -q "\bMotCle\b" "prefixe_${nom_fichier}.html" || compteur <=7
do
wget ...
let "var++"
done
Merci d'avance !
#12 -1 » [RESOLU] BASH: Appliquer une commande à une seule colonne d'un txt » Le 12/08/2014, à 16:04
- Link_Octree
- Réponses : 6
Bonjour,
Je dispose du fichier texte suivant:
Stade de Reims 2 - 2 Paris Saint-Germain
SC Bastia 3 - 3 Olympique de Marseille
Evian TG FC 0 - 3 SM Caen
EA Guingamp 0 - 2 AS Saint-Etienne
LOSC Lille 0 - 0 FC Metz
Je voudrais supprimer les espaces se trouvant juste avant le nom de l'équipe 1, et juste avant celui de l'équipe 2.
Je tiens à faire celà en apprenant comment restreindre une commande sur une colonne en particulier (même si ce n'est pas la méthode la plus "propre" car je compte m'en resservir pour d'autres usages par la suite).
Le code que j'aimerais utiliser serait quelque chose comme ceci:
cat fichier.txt | cut -f3 => pour la "restriction"
sed -i 's/^ *//' fichier.txt => pour la suppression de l'espace en question
Le soucis, c'est que je ne sais pas comment "enchainer" les deux commandes.
Si quelqu'un à une idée, merci d'avance !
#13 Re : -1 » [RESOLU] BASH: Appliquer une commande à une seule colonne d'un txt » Le 13/08/2014, à 08:31
- Link_Octree
- Réponses : 6
Salut vous deux,
pingouinux: Effectivement, je voulais bien supprimer les espaces en début de colonne 1, et en début de colonne 3. Je n'ai pas encore testé ta commande mais je fais çà dès que possible.
Par contre, comme je l'ai précisé en gras dans mon post, et même si c'est pas la plus performante/propre des méthodes, çà serait vraiment important pour moi d'apprendre à "restreindre" une commande sur une colonne en particulier (avec cut, ou un outil similaire) car j'ai la certitude que çà me servira dans un autre contexte plus tard.
Vos commandes seds, bien que beaucoup plus efficaces je n'en doute pas, me permettent pas de les adapter à des cas similaires vu que je ne maitrise vraiment pas sed autant que vous.
Merci d'avance
#14 Re : -1 » [RESOLU] BASH: Appliquer une commande à une seule colonne d'un txt » Le 13/08/2014, à 18:44
- Link_Octree
- Réponses : 6
Je suis en train de tester tout celà en ce moment même, merci beaucoup pingouinux !
La première solution m'intéresse particulièrement, j'ai la certitude que je vais me servir souvent de cette structure
Merci encore, sujet résolu !
#15 -1 » Restreindre grep à une collonne uniquement ? » Le 17/06/2014, à 18:10
- Link_Octree
- Réponses : 8
Hello,
J'ai le fichier visible ci-dessous,
Je voudrais que ma commande retourne le numéro de chaque ligne, avant d'afficher la valeur qu'elle contient, mais qu'elle n'affiche à l'écran que les lignes dont la valeur de la seconde colonne est égale à 5.
2
1
3
1
4
2
1
3
2
1
1
3
2
1
1
8
2
2
3
1
1
5
4
1
1
1
1
8
1
4
1
2
3
1
1
2
1
1
3
1
1
3
1
3
1
5
5
3
1
8
2
3
2
1
1
4
3
3
3
1
10
4
3
5
3
2
7
1
3
1
2
3
Je ne peux pas utiliser cut de la façon dont j'ai l'habitude de le faire car j'aimerais retrouver le numéro de ligne dans le rendu, sous la forme:
22 5
46 5
47 5
64 5
Si vous aviez des propositions de solutions, de préférence des codes assez simples à comprendre, pour que je puisse l'adapter à d'autres scripts, merci !
#16 Re : -1 » Restreindre grep à une collonne uniquement ? » Le 17/06/2014, à 19:24
- Link_Octree
- Réponses : 8
C'est bien celà oui, je teste celà dès que possible merci
Connaitrais-tu une variable pour afficher toutes les lignes (précédé du numéro de ligne) contenant une valeur supérieure à 5 ? Ou moins proprement une valeur de 5, 6, 7, etc jusqu'à 25 ?
Merci beaucoup !
#17 Re : -1 » Restreindre grep à une collonne uniquement ? » Le 18/06/2014, à 20:26
- Link_Octree
- Réponses : 8
Merci beaucoup les gars, les deux solutions fonctionnent parfaitement
#18 Re : -1 » Restreindre grep à une collonne uniquement ? » Le 20/06/2014, à 16:52
- Link_Octree
- Réponses : 8
Plutôt que d'ouvrir un autre thread pour çà:
J'ai intégrée la solution proposée par @pingouinux dans mon script:
nl fichier | awk '$2>=5'
A présent, celà m'arrangerais de pouvoir affecter le nombre minimal (5) dans une variable que je pourrais réutiliser pour obtenir un code du type:
nombre_mini=5
nl fichier | awk '$2>=$nombre_mini'
Celà pose des erreurs d'interprétation dans mon script, je pense que c'est lié aux simple quote, mais le fait de les remplacer par des doubles ne résoud pas le problèmes car à ce moment là, la partie "$2" semble être interprétée anormalement à son tour.
Si vous aviez une idée de solution pour résoudre celà, merci beaucoup, à nouveau !
#19 Re : -1 » Restreindre grep à une collonne uniquement ? » Le 21/06/2014, à 16:13
- Link_Octree
- Réponses : 8
Merci pour le trick, çà fonctionne parfaitement
#20 -1 » Remplacer une chaine de caractères par un fichier txt entier avec sed » Le 23/03/2014, à 14:33
- Link_Octree
- Réponses : 3
Bonjour,
Après une heure de galère/google, je me résoud à poser la question ici:
Je souhaites remplacer la chaine "a_remplacer" du fichier texte squelette.txt par plusieurs autres lignes contenues dans le fichier variable.txt.
squelette.txt
0
a_remplacer
4
variable.txt
1
2
3
J'ai essayé plusieurs solutions (mon séparateur est la charactère dièse puisque mon fichier devrait contenir des slash à termes):
variable=`cat variable.txt`
sed -i "s#a_remplacer#$variable#g" squelette.txt
variable=`cat variable.txt`
sed -i "s#a_remplacer#${variable}#g" squelette.txt[
sed -i "s#a_remplacer#`cat variable.txt`#g" squelette.txt
Le fait que contienne plusieurs lignes ne semble pas plaire à sed qui me renvoi le message suivant:
sed: -e expression #1, char 15: unterminated `s' command
Si quelqu'un a une idée, merci d'avance
#21 Re : -1 » Remplacer une chaine de caractères par un fichier txt entier avec sed » Le 24/03/2014, à 15:07
- Link_Octree
- Réponses : 3
Merci @casperfr & @credenhill: vos deux méthodes fonctionnent parfaitement
#22 -1 » [RESOLU] Appliquer un remplacement sed sur une seule colonne » Le 21/03/2014, à 08:13
- Link_Octree
- Réponses : 5
Salut,
J'ai le fichier structuré suivant 1.txt:
27ème journée 09/03/2012 - 20:00 ESTAC Troyes 0 - 1 Châteauroux
26ème journée 02/03/2012 - 19:00 Châteauroux 2 - 2 Stade de Reims
Je compte intégrer plus tard ce fichier dans une page html, pour celà je cherche à mettre en valeur les matchs où les résultats sont 2-2:
sed -i 's#2 - 2#<strong>2 - 2</strong>#g' 1.txt
Problème, cette commande impacte un autre champs que je ne voudrais pas changer:
27ème journée 09/03/2012 - 20:00 ESTAC Troyes 0 - 1 Châteauroux
Je souhaites donc restreindre ma commande sed seulement sur la colonne souhaitée, j'ai tenté de combiner cat, cut et sed avec des pipes mais sans succés jusque là...
cat 1.txt | cut -f4 -s | sed -i 's#0 - 0#<strong><font color="red">0 - 0</font></strong>#g' 1.txt
Pourriez-vous me proposer une solution fonctionelle proche du code ci-dessous svp ? Un code plus propre/intéligent/rapide existe sûrement mais si je ne suis pas en mesure de le comprendre pour l'adapter à d'autres projets, ce n'est pas ce que je recherche.
Merci d'avance !
#23 Re : -1 » [RESOLU] Appliquer un remplacement sed sur une seule colonne » Le 23/03/2014, à 14:34
- Link_Octree
- Réponses : 5
Merci à credenhill, je suis plutot parti sur ta solution, bien que celle de psyphi semble aussi intéressante, quand à rpl je connaissais pas du tout, merci ek0892 pour cette découverte
#24 -1 » [Bash] Remplacer une ligne par une autre » Le 08/03/2014, à 20:51
- Link_Octree
- Réponses : 1
Bonjour,
J'ai en entrée un fichier txt avec certaines lignes qui sont déja mises en forme dans la syntaxe qui m'intéresse, celle-ci:
2ème journée 18/08/2013 - 14:00 AS Monaco FC 4 - 1 Montpellier Hérault SC 2e Vidéo
3ème journée 23/08/2013 - 20:30 AS Monaco FC 0 - 0 Toulouse FC 2e Vidéo
D'autres lignes sont par contre pollués de données qui ne m'intéressent pas, comme ceci:
Les rencontres de AS Monaco FC - août 2013 1ère journée 10/08/2013 - 21:00 Girondins de Bordeaux 0 - 2 AS Monaco FC 4e Vidéo
Les rencontres de AS Monaco FC - septembre 2013 4ème journée 01/09/2013 - 21:00 Olympique de Marseille 1 - 2 AS Monaco FC 1er Vidéo
Ce que je voudrais faire, c'est uniformiser le tout, et faire en sorte que toutes les lignes soient dans la mise en forme voulue.
Je sais comment détecter les lignes avec la mise en forme inadaptée (grep "Les rencontres de AS Monaco FC"), je sais également supprimer les données superflues (cut -d ' ' -f10-50) mais je ne vois pas comment écraser les données précédements pollués par celles avec la mise en forme voulue (j'ai déja utilisé sed, mais là je vois pas comment faire).
Quelqu'un pourrait-il me donner un coup de main là dessus ? Je privilégie un code compréhensible me permettant de bien comprendre la chose pour l'adapter à d'autres scripts
Pour info le fichier en entree: http://pastebin.com/7b5vpKmf
Merci d'avance !