Il faut que je trie mon fichier dans un shell
Colonne 11 à 20
Colonne 25 à 29
Colonne 1 à 2
Sauf les enregistrements de début et de fin
merci de votre aide
Version imprimable
Il faut que je trie mon fichier dans un shell
Colonne 11 à 20
Colonne 25 à 29
Colonne 1 à 2
Sauf les enregistrements de début et de fin
merci de votre aide
C'est très sibyllin comme message.
Pourrais-tu mettre quelques enregistrements du fichier source et puis comme tu aimerais les avoir au final? Cela permettrait même de faire des tests...
Oui merci comme cela :
avant
10XXX20080808
215520JULES
225520JULES
325520JULES
213123CESAR
223123CESAR
313123CESAR
99000000784
après
10XXX20080808
213123CESAR
223123CESAR
313123CESAR
215520JULES
225520JULES
325520JULES
99000000784
Sans doute ne dois-je pas bien comprendre, mais tu parles de la colonne 29 alors qu'il n'y a que 11 caractères dans tes lignes.
Pourrais-tu soit mettre de vrais enregistrements, soit expliquer ce que tu appelles colonne?
Oui pardon j'ai simplifié pour anonymiser
j'ai mis dans le test
colonne 7 à 11
puis colonne 1 à 2
Le problème est de ne pas bouger la première et la dernière ligne
OK, j'ai compris maintenant. Voici comment je ferais:
1) copier le fichier source sans les premier et dernier enregistrements (fichier_in --> temp_1),
2) reformatter temp_1 pour faire facilement des tris, notamment en séparant les champs par un espace (par exemple), en créant un champ supplémentaire pour les deux chiffres sur lesquels il faut trier, en mettant le champ le plus important en premier (temp_1 --> temp_2),
3) trier suivant les deux champs, dont l'un en numérique (temp_2 --> temp_3),
4) reformatter en sens inverse (temp_3 --> temp_4),
5) remettre les premier et dernier enregistrements (temp_4 --> temp_5),
6) vérifier que tout est là, correctement trié, à la main (temp_5 --> fichier_out).
Pour faire tout ça, faut connaître sort et awk. Tu t'en sors ou tu as besoin d'aide?
Non j'ai besoin d'aide j'ai du mal à comprendre.
Et le fichier que j'ai à trier fait 50 000 lignes au moins.
Et il est quotidien
Deux remarques:
1) C'est pas mon boulot, alors on peut au moins partager, non? Es-tu capable d'extraire les données du fichier initial sans les premier et dernier enregistrements? Et puis ensuite de reprendre ces deux enregistrements du fichier initial pour les ajouter au fichier final?
2) Expose quelques enregistrements réels, avec des données modifiées si tu veux pour éviter de voir surgir mon nom dans un des enregistrements.
Hélas non l'informatique n'est pas mon métier principal et Linux encore moins.
Une commande pour arriver à trier le fichier donné en exemple me suffirait.
Le problème est que tout est dans les détails. Si tu n'y connais rien, une seule option erronée, des guillemets manquants et le programme ne sert plus à rien. Tu ne demandes pas une aide ponctuelle mais de te faire le programme. Ce forum est dédié aux programmeurs, ce que tu avoues ne pas être. Je t'ai donné les deux commandes principales: awk et sort, mais ce n'est évidemment pas suffisant pour un néophyte.
Quels sont tes arguments pour inciter quelqu'un ici à faire le boulot?
Le problème est que je viens pour de l'aide pour rédiger une commande précise qui ne me parait pas être la mer à boire.
il y a une commande wc qui permet de compter les lignes mais mes connaissances linux sont insuffisantes pour en venir à bout.
Si tu penses qu c'est un gros travail c'est juste que tu n'es pas plus au parfum que moi. Alors espère aussi que j'aurai une réponse.;)
Le sort je peux toujours le trouver dans un autre shell mais là il faut que je fasse un tri de la 2ème ligne à la nième ligne moins 1 et attention à la place disque.
Le problème, je crois, est que tu ne réalises pas ce qu'est ce travail à réaliser. Normal puisque tu ne connais pas le langage de script. Alors "pas la mère à boire" est un jugement un hâtif. De plus, pourrais-tu m'expliquer précisemment ce que tu entends par: "Si tu penses que c'est un gros travail c'est juste que tu n'es pas plus au parfum que moi"?
Je ne suis pas certain que ce soit le bon chemin pour entamer une coopération. Mais peut-être me montreras-tu le contraire. Je ne demande qu'à être convaincu.
Salut,
Au vu des compétences de jmelyn. C'est le genre d'affirmation à éviter soledad_001.Citation:
Envoyé par soledad_001
Toutefois voici une petite aide.
- Head
- Tac
Voir les Man pour comprendre la solution.
Code:
1
2
3
4 Exemple sur un ls : ls -1 | head --lines=-1 | tac | head --lines=-1 | tac Ce début de solution s'applique dans ton cas.
Heu... Winnt, si j'étais compétent, je devrais connaître tac, mais c'est la première fois que j'entends parler de cette commande. Elle peut être intéressante dans certains cas, je la retiens... Merci! Et pour la solution que tu donnes, j'en ai une autre:
Explications:Code:ls | tail -n +2 | head -n -1
* Pour la commande ls, l'option -1 est inutile dans les pipes. Je ne sais pas pourquoi mais la sortie multicolonnes n'est active que vers stdout.
* La commande tail -x fichier sort les x dernières lignes d'un fichier (en anglais tail veut dire queue): tail -1 sort la dernière ligne, tail -2 fichier les deux dernières lignes, etc. Mais tail -n +x fichier sort les dernières lignes en comptant à partir du début: tail -n +1 fichier sort les lignes à partir de la première, tail -n +2 fichier les lignes à partir de la deuxième, etc.
* La commande head fonctionne un peu comme tail mais pour le début du fichier (head veut dire tête): head -1 fichier sort uniquement la première ligne, head -2 fichier les deux premières, etc. Mais head -n -x sort les premières lignes sauf les x dernières: head -n -1 fichier sort toutes les lignes saut la dernière, head -n -2 fichier toutes sauf les deux dernières, etc.
Donc pour éliminer les X premières et Y dernières lignes d'un fichier, cela donneIl faut bien sûr remplacer (X + 1) par la valeur numérique, sinon il faut appliquer $((X + 1)) avec l'interpréteur Bash, mais cela est une autre histoire.Code:tail -n +(X + 1) fichier_in | head -n -Y > fichier_out
Salut,
@jmelyn : Je n'ais pas dis que tu connaissais tout :mrgreen: Juste que tu étais compétent. Nuance ;)
Sinon ta solution est interessante elle aussi. :D Merci
mon tri marche sauf les entêtes et pied
ls |tail -n +2 me donne les lignes sauf l'enreg de tête
mais je n'arrive pas à supprimer celui de pied, la commande identique ne va pas avec head
non ce n'est pas çà si je met cette commande en pipe, je perd l'entegistrement d'entête alors que je souhaite le figer
Bravo pour le tri, ce n'était pas un programme trivial. Je suis surpris que tu butes maintenant sur ce petit problème. En voici la solution:
Explications:Code:
1
2
3 head -1 fichier_initial > fichier_final cat fichier_trié >> fichier_final tail -1 fichier_initial >> fichier_final
fichier_initial est le fichier brut, non encore trié, avec en-tête et pied.
fichier_final est le fichier comme tu désires l'obtenir.
fichier_trié est le fichier sans en-tête ni pied, trié comme il faut.
1ere étape: on met l'en-tête.
2e étape: on ajoute la partie triée.
3e étape: on ajoute le pied.
Oui je bute toujours car jen'ai qu'un seul fichier en sortie.
Enfin mon tri met la tête aux pieds et le pied en tête. En plus je ne dois pas être sur Linux mais sur Unix car le tac ne fonctionne pas.
# ajout de la 1ere ligne dans le nouveau fichier :
cat fichier_source|head -1 > fichier_cible
# tri des lignes du 2 au n-1 sed ‘1d’ supprime la 1ère ; sed ‘$d’ supprime la dernière
cat fichier_source|sed -e '$d' -e '1d' | Sort +0.2 -0.10 +0.0 -0.1 >> fichier_cible
# ajout dernière ligne
cat fichier_source|tail -1 >> fichier_cible
Merci à tous de m'avoir aidée