Jump to content

[Bash Shell] Utilisation de "cut" multiple


5h31k

Recommended Posts

Bonjour à tous,

 

J'ai un petit soucis qui dois être très facile à résoudre mais je me prends la tête dessus.

 

J'ai un fichier txt qui contient plein d'information. J'ai besoin de récupérer certains caractères de ce fichier. Voici ma commande pour le faire :

cut -c10-22,34-50,51-52,355-357,601-603 "${fichier}"

Comme vous pouvez voir, je récupère plusieurs champs mais j'obtiens comme résultat :

264125935003315002544102299002007512450358194046150025441022990240075127212591781931500254410229901400751

Dans cette exemple il n'y a que des chiffres mais dans la "vraie" vie il peux aussi avoir des lettres

Le résultat est le bon mais l'affichage est "mauvais" pour moi. Je souhaite obtenir un affichage de cette sorte :

1 | 2641259350033 | 15002544102299002 | 00 | 751 |2 | 2450358194046 | 15002544102299024 | 00 | 751 |3 | 2721259178193 | 15002544102299014 | 00 | 751 |

La première colonne est le numéro de la ligne (1,2,trouze-mille). Les autres champs sont découpés dans la "grande" chaine obtenu auparavent avec le "cut".

 

Pour obtenir ce résultat j'utilise un script :

resultat=$(cut -c10-22,34-50,51-52,355-357,601-603 "${fichier}")num_ligne=0for ligne in ${resultat} ; do    num_ligne=$((${num_ligne}+1))    a=$(echo "${ligne}" | cut -c1-13)    b=$(echo "${ligne}" | cut -c14-30)    c=$(echo "${ligne}" | cut -c31-32)    d=$(echo "${ligne}" | cut -c33-35)    e=$(echo "${ligne}" | cut -c36-38)    echo "${num_ligne} | ${a} | ${b} | ${c} | ${d} | ${e} "done

Les variables ont été modifié pour ne pas poser de soucis. Cependant mon fichier possède plusieurs dizaines de milliers de lignes (C'est un gros fichier texte pouvant atteindre 2Go) et ce script est très long à exécuter.

 

Par exemple, pour un script de 2.058 lignes, il faut 43 secondes au script pour s'exécuter. Le simple "cut" s'exécute en 0.10 secondes (donc invisible à l'oeil).

 

Connaissez-vous une commande ou que me conseillerez-vous de faire pour réduire le temps d'exécution à quelques secondes.
 


Je m'auto-réponds à ce sujet car j'ai trouvé la solution en écrivant mon soucis mais comme je n'avais pas trouvé pas réponse sur Internet, je partage sur NXI.

 

Voici ce que j'ai fait :

cut -c10-22,34-50,51-52,355-357,601-603 "${fichier}" | awk '{print NR" | "substr($0,0,13)" | " substr($0,14,17)" | "substr($0,31,2)" | "substr($0,33,3)" | "substr($0,36,5)}'

Pour tout ceux qui ne trouverais pas de réponse :chinois:

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...