我有一個這樣的制表符分隔檔案:
chr1 104517 105076 abc 148
chr1 127781 128051 def 89
chr1 186884 186981 xyz 97
chr1 127781 128051 def 55
chr1 890934 891105 abc 50
chr1 104517 105076 abc 24
chr1 890934 891105 xyz 19
首先,對于第 4 列中的每個值,我想要第 5 列中的值的總和。喜歡
abc 222
def 144
xyz 116
我用這個代碼做到了:
awk -F'\t' '{ SUM[$4] = $5 } END { for (j in SUM) print j, SUM[j] }' filename
現在我想對前三列的每個獨特組合分別執行此操作。例如,在上述輸入檔案的情況下,我想要這個輸出:
chr1 104517 105076 abc 172
chr1 127781 128051 def 144
chr1 186884 186981 xyz 97
chr1 890934 891105 abc 50 xyz 19
有人可以告訴我在 bash 腳本中執行此操作的方法嗎?
謝謝
uj5u.com熱心網友回復:
我會轉向perl而不是awk因為它更好地支持復雜的資料結構:
$ perl -M5.020 -lane '
our $data;
$data->{$F[0]}{$F[1]}{$F[2]}{$F[3]} = $F[4];
END {
for my $c1 (sort keys %$data) {
for my $c2 (sort { $a <=> $b } keys %{$data->{$c1}}) {
for my $c3 (sort { $a <=> $b } keys %{$data->{$c1}{$c2}}) {
my $rest = $data->{$c1}{$c2}{$c3};
print join("\t", $c1, $c2, $c3, %$rest{sort keys %$rest});
}
}
}
}' input.tsv
chr1 104517 105076 abc 172
chr1 127781 128051 def 144
chr1 186884 186981 xyz 97
chr1 890934 891105 abc 50 xyz 19
基本上,以每行的前四列作為鍵,以第五列的總和作為最終值構建一個4維哈希表。然后按排序順序遍歷表的級別并列印結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373046.html
