ksh88 prend bien en charge $((...)) pour faire du calcul sur des entiers.
Version imprimable
Je pense que ton problème ne viens pas du sed ou autre tail et head mais plus du shell.
En fait c'est la taille de ta variable Bloc qui devient excessive.
Je dirais que 160000 lignes dans un variable, cela commence à faire...
Pour des taille comme ça, je te conseille de passer par des fichier temporaire au lieu de variable.
Tu en fais quoi de ta variable Bloc après ?
2 remarques indépendantes:
- Pour ne pas laisser une question sans réponse: "less" est un outil d'affichage de texte.
Tu peux utiliser "more", puis taper, de la même façon, / pour lancer la recherche de texte, puis taper "sed version".
Ou alors copier coller cette ceci:Code:strings /bin/sed | more
Code:strings /bin/sed | sed -n '/sed version/{N;p}'
- Je ne stocke pas 160000 lignes pour tirer deux infos. Utilise grep (ou sed, ou awk).
Donne un échantillon du fichier de départ ET le résultat attendu.
Bon alors avec la première méthode il ne me trouve pas "/version" ou "/ver" et la deuxième me renvoi un message d'erreur : sed: Function /sed version/{N;p} cannot be parsed.
Les 160000 lignes je les stocke pour les réincorporer dans un nouveau fichier texte en fonction des deux infos que je trouve dedans.
Voici un exemple de fichier en entrée :
Et je voudrais récupérer le deuxième bloc uniquement car 20.01.00.004.002,'59' avec 59 et 20.01.00.001,'987654' avec 987654 dans une liste.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 10.01.00.001.001,'123456789' 10.01.00.001.002,'00001' 20.01.00.001,'123456' 20.01.00.002,'texte' 20.01.00.003.001,'01012012' 20.01.00.003.002,'31122012' 20.01.00.004.001,'02' 20.01.00.004.002,'51' 20.01.00.005,'11' 10.01.00.001.001,'987654321' 10.01.00.001.002,'00002' 20.01.00.001,'987654' 20.01.00.002,'texte' 20.01.00.003.001,'01012012' 20.01.00.003.002,'31122012' 20.01.00.004.001,'02' 20.01.00.004.002,'59' 20.01.00.005,'11'
Deuxième bloc que je veux mettre dans un fichier de sortie :
Code:
1
2
3
4
5
6
7
8
9 10.01.00.001.001,'987654321' 10.01.00.001.002,'00002' 20.01.00.001,'987654' 20.01.00.002,'texte' 20.01.00.003.001,'01012012' 20.01.00.003.002,'31122012' 20.01.00.004.001,'02' 20.01.00.004.002,'59' 20.01.00.005,'11'
- Et que donne ceci?
Code:strings /bin/sed | sed -n '/sed version/!d;N;p'
- Je n'ai jamais dit de chercher "/version" mais "version" ou "sed version".
(Tu es passé devant ton numéro de version sans le voir)
J'obtiens:Code:
1
2 GNU sed version %s 4.2.1
- Je crois que tu as mis un pouce vers le bas pour la bonne réponse: split.
Tu découpes tes 160000 lignes avec cet outil par un:
Tu auras les "petits morceaux faciles à traiter"Code:split -a 3 -l 7000 monfichier
- Pour le reste on verra en fonction de la version de awk et sed.
J'ai bien cherché version après avoir entré / comme dit plus haut.
La commande strings /bin/sed | sed -n '/sed version/!d;N;p' ne me renvoi rien.
Par contre de quelle solution parles-tu avec split ? Parce que j'ai beau regarder la conversation plusieurs fois mais je ne vois pas de référence.. Surtout que je n'ai attribué aucun pouce vert ou rouge !
Sinon du coup je suis en train de regarder la solution vers un fichier temporaire.
- Peux-tu copier/coller le resultat de strings /bin/sed ?
- Que donnent les 2 commandes suivantes?
Code:
1
2 awk --version awk -W version
- Pour le split, j'ai confondu avec la discussion sur la limitation de la taille des fichiers cibles où N_BaH avait répondu.
- Peux-tu copier/coller le resultat de strings /bin/sed ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 @(#)61 1.16 src/bos/usr/ccs/lib/libc/__threads_init.c, libcthrd, bos61B, b2007_33A0 8/2/07 13:09:21 sed.cat nf:e:gu nf:e:gu gpPw0123456789 gpPw0123456789 cannot open %s sed: Cannot create file %s. sed: There are too many '{'. sed: There are too many '}'. sed: Command line is too long. sed: Command line is too long. sed: %s is not a defined label. sed: Cannot open pattern file %s. sed: No editing script was provided. sed: %s is not a recognized function. sed: There are more than one %s labels. sed: Function %s allows only one address. sed: There are too many labels in file %s. sed: There are too many labels in file %s. sed: There are too many line numbers specified. sed: The first regular expression cannot be null. sed: The first regular expression cannot be null. sed: The w function allows a maximum of ten files. sed: The w function allows a maximum of ten files. sed: The label %s is greater than eight characters. sed: Cannot specify an address with the %s function. sed: There are too many commands for the %s function. sed: There are more than 1000 commands in pattern file. @(#)24 1.39 src/bos/usr/bin/sed/sed0.c, cmdedit, bos61H, 0904A_61H 1/5/09 23:44:19 Usage: sed [-n] [-u] Script [File ...] sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...] Usage: sed [-n] [-u] Script [File ...] sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...] Usage: sed [-n] [-u] Script [File ...] sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...] Usage: sed [-n] [-u] Script [File ...] sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...] sed: Function %s cannot be parsed. %lld \%03o \%03o sed: Cannot find or open file %s. sed: There are too many reads after line %lld. sed: The file was not appended after line %lld. @(#)35 1.14.7.1 src/bos/usr/bin/sed/sed1.c, cmdedit, bos61N, 1024A_61N 1/18/10 06:03:10 sed: Memory allocation failed.
- Que donnent les 2 commandes suivantes?
Code:
1
2
3 /sh>awk --version awk: illegal option -- - Usage: awk [-u] [-F Character][-v Assignment][-f File|Commands][Assignment|File] ...
Code:
1
2
3 /sh>awk -W version awk: illegal option -- W Usage: awk [-u] [-F Character][-v Assignment][-f File|Commands][Assignment|File] ...
effectivement ça sent bon le sed livré AIX.
c'est probablement pourquoi des facilité syntaxiques comme Bloc=$(cat "$NomFichier" | sed "${Debut[$j]},${Fin[$j]}!d") ne passent pas.
A tester :
peut être fairepour séparer les éléments shell des contenus syntaxiques sed....Code:sed ''${Debut[$j]}','${Fin[$j]}'!d'
sans aucune garantie j'ai pas testé sur un AIX....:calim2: :?
Merci à tous, je vais pourvoir marquer mon problème comme résolu.
Il ne me reste plus que tous les autres problèmes :mouarf:
Bonjour à tous,
Je reviens vers vous afin d'essayer d'optimiser ma ligne de commande, j'ai actuellement 2 solutions qui prennent sensiblement le même temps.
Savez-vous s'il est possible de les optimiser ?
Code:
1
2
3 cat "$NomFichier" | awk "NR==${Debut},NR==${Fin}" > ../fic/out/BlocEntrepriseTemp.txt cat "$NomFichier" | sed -u "${Debut},${Fin}!d" > ../fic/out/BlocEntrepriseTemp.txt
La première optimisation, c'est de supprimer l'UUOC
Code:
1
2 awk "NR==${Debut},NR==${Fin}" "$NomFichier" > ../fic/out/BlocEntrepriseTemp.txt sed -u "${Debut},${Fin}!d" "$NomFichier" > ../fic/out/BlocEntrepriseTemp.txt
Bonjour
tu peux essayer
qui devrait te creerCode:csplit -f../fic/out/BlocEntrepriseTemp.txt $NomFichier ${Debut} ${FinPlus1}
../fic/out/BlocEntrepriseTemp.txt01
../fic/out/BlocEntrepriseTemp.txt02 <-- celui que tu veux
../fic/out/BlocEntrepriseTemp.txt03
Merci à tous pour vos réponses, mais suite à une concertation il a été décidé de partir sur du perl afin de gérer au mieux l'optimisation...
Sinon, une méthode awk plus rapide que celle proposée:
Code:awk "NR<${debut}{next};NR>${fin}{exit};{print}" "$NomFichier" > ../fic/out/BlocEntrepriseTemp.txt