Re: sort

トップ ページ

このメッセージに返信
著者: Yves Gufflet
日付:  
To: guilde
題目: Re: sort
Si le format est connu Power_<nombre où le point est un underscore et un
exposant>W.asc, on peut extraire le nombre, le convertir en nombre sans
exposant en le paddant de 0 pour pouvoir faire le tri et en mémorisant
le nombre initial pour pouvoir reconstituer le nom du ficher de départ.

C'est vraiment amusant et puissant d'utiliser les commandes sed ou awk
en pipe.

Par exemple, la commande suivante doit faire le travail :

*ls Power* | sed "s/Power_\([0-9_]*e[0-9_]*\)W\.asc/\1/g" | sed
"s/_/./g" | awk ' { printf ("%0100f}%s\n", $1, $0) }' | sort | sed
"s/.*}//g" | sed "s/\./_/g" | sed "s/\(.*\)/Power_\1W.asc/g"*

C'est censé être solide. A vérifier ci dessous :


En détail :

# on liste les fichiers

Power_1_5e5W.asc  Power_1_5e6W.asc  Power_1e5W.asc Power_1e6W.asc 
Power_2e5W.asc  Power_5e5W.asc


# on extrait le nombre

sed "s/Power_\([0-9_]*e[0-9_]*\)W\.asc/\1/g"

1_5e5
1_5e6
1e5
1e6
2e5
5e5


# on remplace les _ par des .

sed "s/_/./g"

1.5e5
1.5e6
1e5
1e6
2e5
5e5


#  on convertit le nombre sans exposant avec un padding et on mémorise
le nombre initial en utilisant } comme séparateur

awk ' { printf ("%0100f}%s\n", $1, $0) }'

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000150000.000000}1.5e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000.000000}1.5e6
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000.000000}1e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000.000000}1e6
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000.000000}2e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000.000000}5e5

# on trie

sort

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000.000000}1e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000150000.000000}1.5e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000.000000}2e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000.000000}5e5
000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000.000000}1e6
000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000.000000}1.5e6

# on récupère seulement le nombre initial en supprimant tout ce qu'il y
a avant le }

sed "s/.*}//g"

1e5
1.5e5
2e5
5e5
1e6
1.5e6

# on remet les _ à la place des points

 sed "s/\./_/g"

1e5
1_5e5
2e5
5e5
1e6
1_5e6

# on reconstitue le nom du fichier original

sed "s/\(.*\)/Power_\1W.asc/g"

Power_1e5W.asc
Power_1_5e5W.asc
Power_2e5W.asc
Power_5e5W.asc
Power_1e6W.asc
Power_1_5e6W.asc