2011-12-30 75 views
5

我有事跟下面的語法猛砸排序正則表達式

ahfsdjfhdfhj_EPI_34_fdsafasdf 
asdfasdf_EPI_2_fdsf 
hfdjh_EPI_8_dhfffffffffff 
ffffffffffasdfsdf_EPI_1_fyyy44 

... 

約100文件總是有EPI_NUMBER。我怎樣才能按這個數字排序呢?

+1

能串_before_'_EPI_'包含'_',且數量總是跟着一個'_'嗎? – Mat 2011-12-30 14:45:55

回答

8

從你的例子看來,分隔符是_,文本EPI_nnn在分隔符_後面出現在相同的位置。如果總是這樣的,那麼你可以使用以下命令將文件進行排序:

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

UPDATE:

如果EPI_文本的位置不固定然後用下面的shell命令:

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

對不起還有像h_fd_fds_fdjh_EPI_8_dhfffffffffff – mecio 2011-12-30 14:53:24

+0

這樣的文件如果是這種情況,請參閱我更新的答案。否則,你也可以在Perl中使用codaddict的回答。 – anubhava 2011-12-30 15:08:56

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 |同時讀一個;做echo'ls | grep $ {a}';完成'解決了我的問題 – mecio 2011-12-30 15:41:32

1

這可能會爲你工作:

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