我正在对一个包含基因表达数据的文本文件进行排序,我需要将基因名称按照特定的顺序排列,以便在后续的任务中使用。我正在使用一个.sh脚本来完成几个任务,包括排序。一些基因具有几乎相同的名称;一个很好的例子是序列"ADNP","ADNP2","ADNP-AS1“。我需要用连字符连接的基因名称排在排序的最后,但现在它排在第二位。
我曾认为添加排序的LC_CTYPE="en_us.UTF-8“和LC_COLLATE="en_us.UTF-8”选项可以解决这个问题,因为这些是在不同的本地计算机上有效的区域设置选项。然而,我总是得到相同的结果。
我尝试过使用echo -e "ADNP ADNP2 ADNP-AS1“| sort和各种排序选项。当我这样做时,我得到了正确的顺序。但是,在运行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=发布于 2019-08-28 07:07:14
下面是一个在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不幸的是,我仍然不知道如何解决问题的根源,但这是一个相当简单的变通办法,很容易在我们已经运行的解析循环中实现。
发布于 2019-08-29 19:05:59
使用echo
-e "ADNP ADNP2 ADNP-AS1“|排序…,我得到了正确的顺序。
这就不足为奇了,因为名称已经在一行中按所需顺序排列,而且sort不会更改一行中的单词顺序。相比之下,
echo -e "ADNP\nADNP2\nADNP-AS1"|sort产生不需要的订单
ADNP
ADNP-AS1
ADNP2我仍然不知道如何解决问题的根源
如果如图所示,连字符后面有一个字母,则sort -d (仅考虑空格和字母数字字符)将生成所需的顺序。
https://stackoverflow.com/questions/57677814
复制相似问题