2011-12-30 13 views
5

tengo algo alrededor de 100 archivos con la siguiente sintaxistipo Bash con expresión regular

ahfsdjfhdfhj_EPI_34_fdsafasdf 
asdfasdf_EPI_2_fdsf 
hfdjh_EPI_8_dhfffffffffff 
ffffffffffasdfsdf_EPI_1_fyyy44 

... 

Siempre hay EPI_NUMBER. ¿Cómo puedo ordenarlo por este número?

+1

Pueden las cuerdas _antes_ '' _EPI_' contener _', y es el número siempre seguido de un '_' también? – Mat

Respuesta

8

De su ejemplo, parece que el delimitador es _ y el texto EPI_nnn aparece en la misma posición después del delimitador _. Si ese es siempre el caso, entonces puede utilizar el comando siguiente para ordenar el archivo:

sort -n -t "_" -k 3 file.txt 

ACTUALIZACIÓN:

Si la posición de EPI_ texto no es fija a continuación, utilizar siguiente comando shell:

sed 's/^\(.*EPI_\)\(.*\)$/\2##\1/' file.txt | sort -n -t "_" -k1 | sed 's/^\(.*\)##\(.*\)$/\2\1/' 
+0

lo siento también hay archivos como h_fd_fds_fdjh_EPI_8_dhfffffffffff – mecio

+0

Pls ver mi respuesta actualizada si ese es el caso. O bien, puedes usar la respuesta de codaddict también en Perl. – anubhava

4

Si Perl está bien se puede:

print sort foo <>;  
sub foo { 
     ($x = $a) =~s/.*EPI_(\d+).*/$1/; 
     ($y = $b) =~s/.*EPI_(\d+).*/$1/; 
     return $x <=> $y; 
} 

y utilizarlo como:

perl prg.pl inputfile 

See it

2
sed -e 's/EPI_/EPI /' file1 file2 ...|sort -n -k 2 -t ' ' 

de tuberías que a sed -e 's/ /_/' para volver la forma original.

+0

'ls | sed 's /.* EPI _ //' | ordenar -n | mientras lees a; hacer eco 'ls | grep $ {a} '; hecho' Solucionado mi problema – mecio

1

Esto podría funcionar para usted:

ls | sed 's/.*EPI_\([0-9]*\)/\1 &/' | sort -n | sed 's/\S* //' 
Cuestiones relacionadas