2015-12-04 86 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

相關問題