Text-Processing
從文件中提取每個對象的最大值
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
數組僅將組名作為鍵保存。