Shell-Script

多次復製文件,寫入重複文件,對文件進行排序,排序後計算特定行的位置

  • May 19, 2019

在我詳細介紹之前,我想指出我已經問過這個問題的某個部分 ->你可以在這裡找到它。我收到了一些不錯的答案,但我需要做更多工作,所以這次我將重複我的問題並添加更多細節:

所以我有一個具有獨特內容的文件,看起來像這樣(讓我們稱之為myUniqueFile):

chromosoom  start    end       phylop   GPS
chr1    28745756    28745756    7.905   5   
chr1    31227215    31227215    10.263  5
chr1    47562402    47562402    2.322   4
chr1    64859630    64859630    1.714   3
chr1    70805699    70805699    1.913   2
chr1    89760653    89760653    -0.1    0
chr1    95630169    95630169    -1.651  -1

如您所見,這些都是具有不同分數的不同位置。

我還有另一個看起來像這樣的文件(讓我們稱之為myDuplicationFile

chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3    33093371    33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927    39597927    8.721   5

因此,首先我想從 to 添加行(標題除外) myUniqueFilemyDuplicationFile但我希望它們以與從添加 myDublicationFile的每個新行重複的方式添加myUniqueFile。所以myDublicationFile保持他的標準內容+從 . 添加 1 個新行myUniqueFile。它應該看起來像這樣:

myDublicatedFile1.txt:

chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3    33093371    33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927    39597927    8.721   5
chr1    28745756    28745756    0.905   1    <- first line from `myUniquefile`


myDublicatedFile2.txt:

chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3    33093371    33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927    39597927    8.721   5
chr1    31227215    31227215    10.263  5    <- second line from `myUniquefile`

因此,對於添加的每個新行,都會創建一個新文件,例如myDublicatedFile3,4,5等等。

在我有了這些myDublicatedFiles新添加的內容之後,我想為特定列從 high 到 low 對這些文件進行排序,(對於phylop列)我這樣做, for f in myDublicatedFile* ; do sort -g -r -k 3 $f >> $f.method1.txt所以看起來像這樣:

myDublicatedFile1.method1.txt:

chr3    39597927    39597927    8.721   5
chr1    28745756    28745756    7.905   5 <- count 2
chr3    33093371    33093371    3.753   4
chr3    30648039    30648039    2.214   3
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    31663820    31663820    0.713   3
chr3    15540407    15540407    -1.391  -1
chromosoom  start    end       phylop   GPS

所以在我對這些文件進行排序之後,我想知道我在排序後添加的行的位置。對我來說,用“grep”做一些事情並使用“count”似乎是合乎邏輯的。

因此,myDublicatedFile1.method1.txt此計數/排名為 2,因為添加的行 frommyUniquefile最終位於文件的第二位。

在計算phlop**(method1)列的計數/排名後,我想對GPS(method2)**列進行排序,然後再次計算添加行的排名。myDublicatedFile1.method1.method2.txt 應該如下所示:

chr3    39597927    39597927    8.721   5
chr1    28745756    28745756    7.905   5 
chr3    33093371    33093371    3.753   4
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    15540407    15540407    -1.391  -1
chromosoom  start    end       phylop   GPS

如果將計數/排名寫在不同的文件中,這很容易,這樣我以後可以將它們用於統計。所以最重要的文件是這些文件,因為我最終會使用這些文件:)

就像是:

countsForMethod1.txt:

29
3
5
6
50
etc.

countsForMethod2.txt:

7
3
21
45
etc..

假設您有splitfrom GNU的版本coreutils,以及類似bash,的 shellkshzsh可用(用於此處使用的程序替換功能),您可以修改先前接受的答案以處理標題行和排序,例如

tail -n +2 myUniqueFile | SHELL=$(command -v bash) split -l1 --filter='{ 
 head -n 1 myDuplicationFile &&
   sort -g -r -k4,4 <(tail -n +2 myDuplicationFile) -
 } > "$FILE"'

然後,您可以使用簡單awk的單線查找myUniqueFile輸出文件中條目的位置:

awk 'FNR==NR && NR>1 {a[$0]++; next} ($0 in a) {print FILENAME, FNR}' myUniqueFile xa?
xaa 3
xab 2
xac 4
xad 5
xae 5
xaf 8
xag 9

沖洗並重複其他方法/排序順序。

引用自:https://unix.stackexchange.com/questions/413276