Bash按正则表达式排序

时间:2011-12-30 14:41:23

标签: linux bash sorting console

我有大约100个文件,其语法如下

ahfsdjfhdfhj_EPI_34_fdsafasdf
asdfasdf_EPI_2_fdsf
hfdjh_EPI_8_dhfffffffffff
ffffffffffasdfsdf_EPI_1_fyyy44

...

总有EPI_NUMBER。我该如何按这个数字排序?

4 个答案:

答案 0 :(得分:10)

在您的示例中,分隔符_的分隔符显示为EPI_nnn,文本_在分隔符sort -n -t "_" -k 3 file.txt 后位于相同的位置。如果总是如此,那么您可以使用以下命令对文件进行排序:

EPI_

<强>更新

如果sed 's/^\(.*EPI_\)\(.*\)$/\2##\1/' file.txt | sort -n -t "_" -k1 | sed 's/^\(.*\)##\(.*\)$/\2\1/' 文本的位置不是已修复,请使用以下shell命令:

{{1}}

答案 1 :(得分: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 :(得分:2)

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

将其传送到sed -e 's/ /_/'以取回原始表单。

答案 3 :(得分:1)

这可能对您有用:

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