Text-Processing

從文件中提取每個對象的最大值

  • April 9, 2021

bash我需要從我的 CentOS 系統上的文件中提取一些值。在myfile.txt我有一個稱為對象的列表,Info_region其中每個對像都用程式碼(例如等)標識。BARD1_region_005此外BIRC2_region_002,還有一些其他列報告了一些數值變數。同一個對象(同一個代號)可以在我的文件中重複多次。我還有一個文件,其中包含一個完整列表,其中包含所有目標程式碼,沒有重複。我想獲得一個 output.txt 文件,其中每個對象(代號)只報告一次,就像在我的 list-file.txt 中一樣,我想將與 myfile 中與該代號關聯的最大可能值相關聯。文本。

myfile.txt:(列由 分隔tab

Info_region Lig_score   Lig_prevista    Lig_prevista_+1 Int_score   Expo_score  Protac_score
BARD1_region_005    0   3   3   0   1   1
BARD1_region_006    0   1   1   0   1   1
BIRC2_region_001    1   6   7   0   1   2
BIRC2_region_001    1   7   8   0   1   2
BIRC2_region_001    0   2   2   0   0   0
BIRC2_region_001    0   12  12  0   1   1
BIRC2_region_001    1   10  11  -1  1   1
BIRC2_region_001    1   2   3   0   1   2
BIRC2_region_001    1   0   1   0   1   2
BIRC2_region_001    1   6   7   0   1   2
BIRC2_region_002    0   0   0   0   1   1
BIRC2_region_002    1   0   0   -1  0.5 0.5
BIRC2_region_003    0   0   0   0   1   1
BIRC2_region_004    0   1   1   0   1   1
UHRF1_region_004    0   0   0   1   1   2
UHRF1_region_004    0   0   0   1   1   2
UHRF1_region_004    1   0   1   0   0.5 1.5
UHRF1_region_004    0   0   0   1   1   2
UHRF1_region_005    0   3   3   1   1   2
UHRF1_region_005    1   0   0   -1  1   1

文件列表.txt:

Info_region
BARD1_region_005
BARD1_region_006
BIRC2_region_001
BIRC2_region_002
BIRC2_region_003
BIRC2_region_004
UHRF1_region_004
UHRF1_region_005

輸出.txt:

Info_region Lig_score   Lig_prevista    Lig_prevista_+1 Int_score   Expo_score  Protac_score
BARD1_region_005    0   3   3   0   1   1
BARD1_region_006    0   1   1   0   1   1
BIRC2_region_001    1   12  12  0   1   2
BIRC2_region_002    1   0   0   0   1   1
BIRC2_region_003    0   0   0   0   1   1
BIRC2_region_004    0   1   1   0   1   1
UHRF1_region_004    1   0   1   1   1   2
UHRF1_region_005    1   3   3   1   1   2

有人可以幫我嗎?謝謝!

假設數據在被呼叫的文件file中並且在第一列上排序,GNUdatamash實用程序可以單獨對數據文件執行此操作:

datamash -H -W -g 1 max 2-7 <file

這指示實用程序使用空格分隔的列(-W如果您的列是真正的製表符分隔,則刪除它),數據的第一行包含標題(-H),按第一列(-g 1)分組,併計算最大值第 2 到第 7 列。

結果,給定問題中的數據:

GroupBy(Info_region)    max(Lig_score)  max(Lig_prevista)       max(Lig_prevista_+1)    max(Int_score)     max(Expo_score) max(Protac_score)
BARD1_region_005        0       3       3       0       1       1
BARD1_region_006        0       1       1       0       1       1
BIRC2_region_001        1       12      12      0       1       2
BIRC2_region_002        1       0       0       0       1       1
BIRC2_region_003        0       0       0       0       1       1
BIRC2_region_004        0       1       1       0       1       1
UHRF1_region_004        1       0       1       1       1       2
UHRF1_region_005        1       3       3       1       1       2

您還可以使用--header-in代替-H來獲取無標題輸出,然後從原始數據文件中獲取標題:

{ head -n 1 file; datamash --header-in -W -g 1 max 2-7 <file; } >output

在這裡,我還將結果寫入一些名為output.


使用awk和假設製表符分隔的欄位:

awk -F '\t' '
   BEGIN { OFS = FS }
   NR == 1 { print; next }
   {
       n[$1] = 1
       for (i = 2; i <= NF; ++i)
           a[$1,i] = (a[$1,i] == "" || $i > a[$1,i] ? $i : a[$1,i])
   }
   END { 
       nf = NF
       for (j in n) {
           $0 = j
           for (i = 2; i <= nf; ++i)
               $i = a[$1,i]
           print
        }
    }' file

這將計算每個組的每列中的最大值。這些數字儲存在a數組中,而n數組僅將組名作為鍵保存。

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