Csv
根據範常式式碼將第三列中的不同術語組合成一行
我有一些包含三列的基因組數據。第 1 列是樣本,第 2 列是癌症類型,第 3 列是機制。在第三行中,每個樣本都有一個或多個分配給它的基因機制(例如 6 個 ecDNA)。目前,對於每個樣本,每個機制都有多行(例如,樣本 x 有 4 行採用“6 ecDNA”機制,5 行採用“5 缺失”機制,其中每一行對應於為該樣本發現的一個遺傳畸變)。
我想知道是否有一種方法可以在一行中顯示每個樣本的數據中的所有類型的機制
(例如樣本癌症縮寫機制)
x Bladder 6 ecDNA, 5 deletion
有沒有辦法將樣本的機制類型濃縮成一行?編輯:這是 OG 數據集的代表表,帶有範例樣本“x”和“y”。
樣本,癌症縮寫,機制
x, Bladder, 6 ecDNA x, Bladder, 6 ecDNA x, Bladder, 5 deletion x, Bladder, 5 deletion y, Osteosarcoma, 4 transposition y, Osteosarcoma, 4 transposition y, Osteosarcoma, 5 deletion y, Osteosarcoma, 6 ecDNA
….
#!/usr/bin/perl use strict; my %rec; while(<>) { chomp; s/^\s+|\s*$//; next if m/^$/; my ($c1,$c2,$c3) = split /\s{2,}|\t+/; $rec{$c1}->{$c2}->{$c3} = 1; } # find the largest widths (lengths) of the first two columns, minimum 6 for each my $l1=6; my $l2=6; foreach my $k1 (keys %rec) { $l1 = length($k1) if (length($k1) > $l1); foreach my $k2 (keys %{ $rec{$k1} }) { $l2 = length($k2) if (length($k2) > $l2); } }; # use that to build a format string my $fmt = "%-${l1}s\t%-${l2}s\t%s\n"; printf $fmt, "Sample", "Cancer", "Mechanisms"; foreach my $k1 (sort keys %rec) { foreach my $k2 (sort keys %{ $rec{$k1} }) { printf $fmt, $k1, $k2, join(", ",sort keys %{ $rec{$k1}->{$k2} }); }; }
這個 perl 腳本讀取每個輸入行,刪除任何前導或尾隨空格,並跳過空行。我不確定輸入文件是否只有一個或多個製表符分隔每一列,或者多個空白字元 - 我已經編寫了它來處理任何一個。
它建構了一個名為 %rec 的資料結構來保存每條記錄。資料結構是多級散列(關聯數組),其中前兩級是前兩列的名稱(Sample 和 Cancer),第三級包含 Mechanisms。
即 %rec 資料結構最終看起來像這樣:
%rec = { x => { Bladder => { "5 deletion" => 1, "6 ecDNA" => 1 } }, y => { Osteosarcoma => { "4 transposition" => 1, "5 deletion" => 1, "6 ecDNA" => 1 }, }, }
有關 perl 資料結構的更多資訊,請參閱
man perldsc
或perldoc perldsc
。另請參閱man perlreftut
有關製作和使用此類資料結構的簡短教程。0完成讀取整個輸入文件後,為每條記錄列印一個摘要行(在計算出每列的寬度之後)。輸出是製表符分隔的。
將其另存為,例如
combine.pl
,並使其可執行chmod +x
。$ chmod +x ./combine.pl $ ./combine.pl input.txt Sample Cancer Mechanisms x Bladder 5 deletion, 6 ecDNA y Osteosarcoma 4 transposition, 5 deletion, 6 ecDNA