linux - 我如何强制排序命令将 'ADNP-AS1' 放在 'ADNP2' 之后,而不是相反?

标签 linux sorting

我正在对一个包含基因表达数据的文本文件进行排序,我需要基因名称按特定顺序排列,以便进一步执行后续任务。我正在使用 .sh 脚本执行多项任务,包括排序。有些基因的名字几乎相同;一个很好的例子是序列“ADNP”、“ADNP2”、“ADNP-AS1”。我需要带连字符的基因名称在排序时排在最后,但现在它排在第二位。

我原以为添加 LC_CTYPE="en_us.UTF-8"和 LC_COLLATE="en_us.UTF-8"选项来排序会解决这个问题,因为这些是在不同本地机器上工作的语言环境选项.但是,我一直得到相同的结果。

我使用 echo -e "ADNP ADNP2 ADNP-AS1"| 做了一些实验使用各种选项进行排序。当我这样做时,我得到了正确的顺序。但是,在运行 shell 脚本时(如下所示),我没有。我还将提供

的输出

这是 shell 脚本的摘录

tail -n +2 $tpm | LC_CTYPE=en_us.UTF-8 sort -k1,1 | cut -f 4  > "${wd}/${sample}_host.tmp"

这是我的区域设置

locale   
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

最佳答案

这是 R 中可重现的最小示例:

> geneSamp <- c("ADNP", "ADNP-AS1", "ADNP2")
> sampExprVals <- c(10, 20, 0)
> geneDF <- data.frame(geneSamp, sampExprVals)
> correctGeneOrder <- data.frame(a = c("ADNP", "ADNP2", "ADNP-AS1"), b = c(10, 0, 20))
> geneDF <- geneDF[order(match(correctGeneOrder[, 1], geneDF[, 1])),]
> print(geneDF)
  geneSamp sampExprVals
1     ADNP           10
3    ADNP2            0
2 ADNP-AS1           20

不幸的是,我仍然不知道如何解决问题的根源,但这是一个相当简单的解决方法,很容易在我们已经运行的解析循环中实现。

关于linux - 我如何强制排序命令将 'ADNP-AS1' 放在 'ADNP2' 之后,而不是相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57677814/

相关文章:

python - 字典中出现次数最多的值

algorithm - 如何在线性时间内放置 2 个可能值的 "sort"元素?

php - 在 PHP 中根据另一个数组的值对数组进行排序

linux - 根据特定的搜索模式拆分文件,并使用 AWK 命令在拆分文件中包含特定行数

php - opendkim 命令不适用于 PHP

linux - Bash "ps"并行进程并检查它们何时完成

php - 在 pcntl_fork 之后如何在父进程中保持我的 mysql 连接?

java - 将数组列表打印到输出文件中?

javascript - javascript中的最大堆?

windows - 适用于 Windows 和 Linux 的 Delphi