【问题标题】:Bash sort by regexpBash 按正则表达式排序
【发布时间】:2012-01-30 14:54:29
【问题描述】:

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

ahfsdjfhdfhj_EPI_34_fdsafasdf
asdfasdf_EPI_2_fdsf
hfdjh_EPI_8_dhfffffffffff
ffffffffffasdfsdf_EPI_1_fyyy44

...

总是有 EPI_NUMBER。我怎样才能按这个数字排序?

【问题讨论】:

  • 字符串before _EPI_是否可以包含_,数字后面是否也总是跟_

标签: linux bash sorting console


【解决方案1】:

从您的示例看来,分隔符是_,而文本EPI_nnn 位于分隔符_ 之后的相同位置。如果总是这样,那么您可以使用以下命令对文件进行排序:

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

更新:

如果EPI_ 文本的位置不是固定,则使用以下shell 命令:

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

【讨论】:

  • 对不起还有像h_fd_fds_fdjh_EPI_8_dhfffffffffff这样的文件
  • 如果是这种情况,请查看我的更新答案。或者你也可以在 Perl 中使用 codaddict 的答案。
【解决方案2】:

如果 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

【讨论】:

    【解决方案3】:
     sed -e 's/EPI_/EPI /' file1 file2 ...|sort -n -k 2 -t ' '
    

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

    【讨论】:

    • ls | sed 's/.*EPI_//' | sort -n | while read a; do echo ls | grep ${a}; done 解决了我的问题
    • 另请参阅:superuser.com/a/79359/128768,尽管它可能不起作用,因为要排序的部分不在字符串的末尾。 ?
    【解决方案4】:

    这可能对你有用:

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

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2016-11-11
      • 2018-04-16
      相关资源
      最近更新 更多