2011-12-30 101 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* //'