0
votes

Fonctionnement arithmétique AWK à partir de la chaîne

J'ai une colonne spécifique dans un fichier qui contient des chaînes telles que ceci: xxx

Je veux le résultat numérique: xxx

J'ai essayé cela, veuillez noter que les tailles figurent sur la 6ème colonne de mon fichier: xxx

edit1 mon fichier d'entrée ressemble à ceci: xxx < / Pré>

La multiplication est ignorée.

pouvez-vous aider?


3 commentaires

@Oguzismail Les tailles sont sur la 6ème colonne de mon fichier d'entrée


@oguzismail je viens d'ajouter une édition1


Est l'opération arithmétique toujours * ou pourrait-il parfois être + ou / ou ...????


6 Réponses :


2
votes

Ceci est un moyen générique pour évaluer la chaîne, il pourrait traiter * , + , - , / Etc. Si vous pouvez utiliser perl , il est possible d'option à eval la chaîne, cela évaluera la chaîne pour l'opération mathématique de l'entrée.

cas-1: Lors de l'évaluation complète de la ligne: xxx

cas-2: Lors de l'évaluation d'une colonne seulement : Dans cette affaire 6e colonne. Fournissez le numéro de colonne à obtenir évalué, F [5] est la 6ème colonne. xxx

cas-3: lors de l'évaluation de la 6ème colonne, mais d'impressionner tout enregistrement. Évaluez la 6ème colonne et mettez à jour sa valeur, imprimez plus tard toute la ligne. xxx


2 commentaires

Merci beaucoup pour votre perl one-liner, je l'aime. Maintenant, j'ai tapé cela pour résumer toutes les tailles qui sont sur la 6e Colum, c'est que OK: perl -nale '$ Taille + = EVAL $ F [-1] if / mp4 /; fin $ Taille}' fichier ?


Oui, vous pouvez le faire, en supposant que vous soyez sûr que la chaîne d'intérêt est toujours dans la dernière colonne.



2
votes

Pourriez-vous s'il vous plaît essayer de suivre (testé et écrit après avoir vu des échantillons fournis uniquement).

awk '{split($NF,array,"*");printf("%.01f\n",array[1]*array[2])}' Input_file


4 commentaires

Les tailles sont sur la 6ème colonne de mon fichier d'entrée


@Sebma, mais vos échantillons montrent que c'est la 1ère et la 2e colonne Si je considère le séparateur de champ comme * , veuillez publier votre exemple d'exemple_fon_file dans votre message et indiquez-nous alors.


Je viens d'ajouter une édition1


Utilisez * ou espace comme séparateur de champ et utilisez la deuxième dernière et dernière colonne: awk -f '[*]' '{printf ("%. 1f \ n", $ (nf-1 " ) * $ Nf)} 'fichier



2
votes

sprintf code> ne peut pas évaluer les opérations elles-mêmes. Vous devez analyser et les évaluer, puis sprintf code> peut être utilisé pour convertir le résultat en une chaîne avec un format spécifique.

$ awk -v OFS='  ' 'split($NF,a,/\*/)>1{$NF=a[1]*a[2]} 1' file
[[  ]]  toto1.mp4  2019-04-16  22:11  1126.4
[[  ]]  toto2.mp4  2019-04-16  21:41  1024
[[  ]]  toto3.mp4  2019-04-16  22:40  1126.4
[[  ]]  toto4.mp4  2019-04-16  22:09  1126.4


0 commentaires

2
votes

AWK ne peut pas évaluer les expressions dans des variables, vous devez construire un évaluateur pour cela ou évaluer une autre manière, comme: xxx

sortie: xxx < / Pré>

Il y a des programmes AWK flottant autour qui peuvent évaluer, par exemple calc3 . Google est votre ami, mon ami.


0 commentaires

2
votes

Est-ce ce que vous essayez de faire? XXX


0 commentaires

0
votes

Si les données dans d code> fichier, essayé sur GNU AWK:

 awk -F'\\*' '{a=$1*$2; printf "%-6.1f\n",a}' d


0 commentaires