2011-12-30 3 views
5

Tôi có một cái gì đó khoảng 100 tập tin với cú pháp như sauloại Bash bởi regexp

ahfsdjfhdfhj_EPI_34_fdsafasdf 
asdfasdf_EPI_2_fdsf 
hfdjh_EPI_8_dhfffffffffff 
ffffffffffasdfsdf_EPI_1_fyyy44 

... 

Luôn luôn có EPI_NUMBER. Làm thế nào tôi có thể sắp xếp nó theo số này?

+1

thể các dây _before_ '_EPI_' chứa' _', và là số luôn luôn theo sau là một '_' quá? – Mat

Trả lời

8

Từ ví dụ của bạn, có vẻ như dấu phân cách là _ và văn bản EPI_nnn có cùng vị trí sau dấu phân tách _. Nếu đó là luôn luôn như vậy thì bạn có thể sử dụng lệnh sau để sắp xếp các file:

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

UPDATE:

Nếu vị trí của EPI_ văn bản không phải là cố định sau đó sử dụng sau lệnh shell:

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

xin lỗi cũng có các tệp như h_fd_fds_fdjh_EPI_8_dhfffffffffff – mecio

+0

Vui lòng xem câu trả lời cập nhật của tôi nếu đúng như vậy. Hoặc người nào khác bạn có thể sử dụng câu trả lời của codaddict cũng như trong Perl. – anubhava

4

Nếu Perl không sao, bạn có thể:

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

và sử dụng nó như:

perl prg.pl inputfile 

See it

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

ống đó để sed -e 's/ /_/' để lấy lại hình thức ban đầu.

+0

'ls | sed 's /.* EPI _ //' | sắp xếp -n | trong khi đọc một; do echo 'ls | grep $ {a} '; done' Giải quyết vấn đề của tôi – mecio

1

Điều này có thể làm việc cho bạn:

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