4列と数千行には、次の情報を含む.txtファイルがたくさんあります。
chr10 73121691 18 SLC29A3
chr10 73121692 14 SLC29A3
chr10 73121693 10 SLC29A3
chr10 73120590 15 SLC29A3
chr10 73120591 15 SLC29A3
chr10 73120592 6 SLC29A3
chr10 12345678 25 COL1A1
chr10 12345679 8 COL1A1
chr10 12345680 6 COL1A1
chr17 48431036 5 LRP5
chr17 48431037 8 LRP5
chr17 48431038 5 LRP5
私が望む出力は次のとおりです。
chr10 73121691 - 73121693 , 14, SLC29A3
chr10 73120590 - 73120592 , 12, SLC29A3
chr10 12345679 - 12345680 , 13, COL1A1
chr17 48431036 - 48431038 , 6, LRP5
連続数字の文字#範囲、列3の平均、範囲に関連付けられた名前。
一度に複数のファイルに対してこれを実行するために使用できるスクリプトはありますか?
ありがとう
答え1
すべての生物情報学者が必要とするものデータ統合彼らのツールキットに :)
$ datamash -W groupby 1 min 2 max 2 mean 3 unique 4 < tmp/data.txt
chr10 73121691 73121693 14 SLC29A3
chr17 48431036 48431038 6 LRP5
コマンドライン引数の数字は列を表します。したがって、1列に基づいてグループ化し、2列の最小値と最大値(範囲)、3列の平均、および4列の対応する項目をカンマで区切ったリストを提供します。
答え2
あなたの質問に対する答えに応じて、あなたが望むものかもしれません。私のコメント:
$ cat tst.awk
$2 != (prev[2] + 1) {
if (NR > 1) {
prt()
}
split($0,beg)
sum = cnt = 0
}
{
split($0,prev)
sum += $3
cnt++
}
END { prt() }
function prt( ave) {
ave = (cnt ? sum / cnt : 0)
print prev[1], beg[2], "-", prev[2], "," ave ",", prev[4]
}
$ awk -f tst.awk file
chr10 73121691 - 73121693 ,14, SLC29A3
chr10 73120590 - 73120592 ,12, SLC29A3
chr10 12345678 - 12345680 ,13, COL1A1
chr17 48431036 - 48431038 ,6, LRP5