2015-12-04 64 views
0

我在文件中有一个名为mydirectory的目录中的多个文件。我想根据LeftChr列和RightChr列首先使用一些bash/awk/sed命令对所有这些文件进行排序,并获取result根据两列对目录中的多个csv文件进行排序

>Id LeftChr LeftPosition LeftStrand LeftLength RightChr RightPosition RightStrand 
1979  chr1  825881   -   252  chr2  5726723   - 
5480  chr2  826313   +   444  chr2  5727501   + 
5492  chr5  869527   +   698  chr2   870339   + 
1980  chr2  1584550   -   263  chr1  1651034   - 
5491 chr14  1685863   +   148  chr1  1686679   + 
5490  chr1  1691382   +   190  chr1  1693020   + 

结果

>Id LeftChr LeftPosition LeftStrand LeftLength RightChr RightPosition RightStrand 
5490  chr1  1691382   +   190  chr1  1693020   + 
1979  chr1  825881   -   252  chr2  5726723   - 
1980  chr2  1584550   -   263  chr1  1651034   - 
5480  chr2  826313   +   444  chr2  5727501   + 
5492  chr5  869527   +   698  chr2   870339   + 
5491 chr14  1685863   +   148  chr1  1686679   + 
+0

阅读您的文件转换成R.然后DF [,顺序(DF $ LeftChr,DF $ RightChr) –

回答

0

假设你有机会获得一个合理的计算环境,下面应该为你正在尝试做的基础:

in=input.txt; head -n 1 "$in"; tail -n +2 "$in" | sort -k2,2 -k6,6 

有几个潜在的问题,但是。一种是您发布的输入文件通常不是“CSV”文件。另一个是你是否想要“稳定排序”。

0

负载式的R

result <- yourdataname[order(,yourdataname[,LeftChr], yourdataname[,RightChr])] 

如果数据集中有来港:

result <- yourdataname[order(yourdataname[,"LeftChr"],yourdataname[,"RightChr"], na.last = NA),] 
1

这可能会为你工作(GNU sed和排序):

sed '1b;/Id/d;s/chr//g' mydirectory/*.csv | 
sort -k2,2n -k6,6n | 
sed '1b;s/\S\+/chr&/2;s/\S\+/chr&/6' > outputFile 

这删除除第一个标题以外的所有文件,并从所有文件中删除文字chr。随后的文件被传送到一个按第二个和第六个字段数字排列文件的排序。这个内容被传送到最后的sed命令中,该命令会忽略第一行(标题行)并替换第二个和第六个字段中的文字chr

1
awk 'h{NF+=0;print |"sort -t\" \" -k2.4n -k6.4n"}!h{print;h=1}' file | column -t 
Id LeftChr LeftPosition LeftStrand LeftLength RightChr RightPosition RightStrand 
5490 chr1  1691382  +   190   chr1  1693020  + 
1979 chr1  825881  -   252   chr2  5726723  - 
1980 chr2  1584550  -   263   chr1  1651034  - 
5480 chr2  826313  +   444   chr2  5727501  + 
5492 chr5  869527  +   698   chr2  870339   + 
5491 chr14 1685863  +   148   chr1  1686679  + 

是啊,这种模式不会成为上述答案的

+0

我喜欢这个答案,所以不想增加我自己...但是我们需要做一个文件目录......这样做不是更好:awk -vh = 0'!h {print; h = 1} NR> 1 {print | “排序......后面跟着你非常可爱的排序-fu?为什么我们不想把列-t放在awk脚本之外? –

+0

你说得对,'column -t' out ... – bian

+0

考虑到我们没有想要在随后的文件中打印标题;因此,我非常确定我们要使用NR> 1 {print |“sort ...}而不是h {print | “sort ......}我也认为NF + = 0没有做任何事情,所以...建议:awk'NF> 1 {print |”sort -t \“\”-k2.4n -k6.4n“ }!h {print; h = 1}'FILE1 FILE2 FILE3 | column -t ...你认为如何? –

0

没有为我工作,但能把这个像这样的东西做。

for x in *.csv; do grep -v "^>" *.csv | sort -k2,2V -k6,6V -k3,3n -t $','<"$x" >"$x.tmp" mv "$x.tmp" "$x" done

相关问题