2011-12-30 7 views
5

у меня есть что-то около 100 файлов со следующим синтаксисомBash сортировать по регулярному выражению

ahfsdjfhdfhj_EPI_34_fdsafasdf 
asdfasdf_EPI_2_fdsf 
hfdjh_EPI_8_dhfffffffffff 
ffffffffffasdfsdf_EPI_1_fyyy44 

... 

Существует всегда EPI_NUMBER. Как я могу отсортировать его по этому номеру?

+1

Может строки _перед_ '' _EPI_' содержат _', и число всегда сопровождается символом '_' тоже? – Mat

ответ

8

Из вашего примера видно, что разделитель _, а текст EPI_nnn находится в том же положении после разделителя _. Если это всегда так, то вы можете использовать следующую команду для сортировки файла:

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

UPDATE:

Если позиция EPI_ текста не фиксированной затем использовать следующую команду оболочки:

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

Извините, что есть такие файлы, как h_fd_fds_fdjh_EPI_8_dhfffffffffff – mecio

+0

Pls видит мой обновленный ответ, если это так. Или вы также можете использовать ответ codaddict в Perl. – anubhava

4

Если Perl нормально вы можете:

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

и использовать его как:

perl prg.pl inputfile 

See it

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

трубы, что sed -e 's/ /_/' вернуть первоначальную форму.

+0

'ls | sed 's /.* EPI _ //' | sort -n | при чтении a; do echo 'ls | grep $ {a} '; done' Решил мою проблему – mecio

1

Это может работать для вас:

ls | sed 's/.*EPI_\([0-9]*\)/\1 &/' | sort -n | sed 's/\S* //' 
Смежные вопросы