9 votos

¿Cómo puedo llamar a un módulo en un comando de una sola línea de Perl?

Digamos que tengo un archivo de datos que quiero procesar; quiero tomar el valor máximo de cada columna y añadirlo al final de cada línea.

ENTRADA:

T1 T2 T3
35.82 34.67 31.68
32.20 34.52 33.59
37.41 38.64 37.56

SALIDA:

T1 T2 T3
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64

Estoy tratando de implementar esto como una línea de comando. Hasta ahora, esto es lo que he ideado, aunque se queja de que &main::max está indefinido:

perl -MList::Util -ani.bak -e "print qq(@F).q( ).max(@F).qq(\n)" archivo1.txt

Parece que no he cargado el módulo List::Util. ¿Qué está mal? ¿Y el encabezado de la columna es un problema?

perlrun no tiene un ejemplo decente de cómo hacer esto (en realidad sí, mi documentación era un poco difícil de leer).

23voto

Greg Bacon Puntos 50449

Has cargado List::Util, pero el módulo no exporta símbolos por defecto. Salta la línea de encabezado comprobando si $. es 1.

$ perl -MList::Util=max -ape 's/$/" " . max(@F)/e unless $.==1' input 
T1 T2 T3
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64

La documentación de perlrun explica:

Un poco de azúcar sintáctica integrada significa que también puedes decir -mmodule=foo,bar o -Mmodule=foo,bar como un atajo para -Mmodule qw(foo bar). Esto evita la necesidad de usar comillas al importar símbolos. El código real generado por -Mmodule=foo,bar es use module split(/,/,q{foo,bar}). Nota que la forma = elimina la distinción entre -m y -M.

4voto

draegtun Puntos 17081
perl -M"List::Util 'max'" -ani.bak -e "print qq(@F).q( ).max(@F).qq(\n)" file1.txt

2voto

Dave Sherohman Puntos 25122

List::Util se cargó, pero no exporta la función max de forma predeterminada:

perl -MList::Util -ani.bak -e "print qq(@F).q( ).List::Util::max(@F).qq(\n)" file1.txt

1voto

ghostdog74 Puntos 86060

Si Perl no es obligatorio, aquí tienes un comando awk de una sola línea

$ awk '{for(i=1;i<=NF;i++)if($i>t){t=$i};print $0,t;t=0}' archivo
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X