したがって、次のようないくつかの署名マーカー(chr、start、end、chr、アスタリスク、end、重複するデフォルトのペアの数)を含む挿入ヒットを含むファイルがあります。
chr1 69744110 69793325 . -1 -1 0
chr1 82791976 82831348 chr1 82792114 82792615 501
chr1 82791976 82831348 chr1 82816285 82817077 792
chr1 82791976 82831348 chr1 82828015 82829891 1876
chr1 88599340 88658398 . -1 -1 0
chr1 137772945 137830035 . -1 -1 0
chr1 137875312 137920590 . -1 -1 0
chr1 193433080 193446861 . -1 -1 0
chr10 26483800 26501370 chr10 26484794 26485295 501
chr10 68069913 68089436 . -1 -1 0
chr10 95098349 95113967 . -1 -1 0
chr10 97310211 97335589 . -1 -1 0
chr10 111083097 111118237 chr10 111088928 111090274 1346
chr10 117904141 117947090 chr10 117905334 117906320 986
chr10 117904141 117947090 chr10 117918966 117919852 886
chr10 117904141 117947090 chr10 117926867 117927368 501
chr11 11521339 11587607 chr11 11523970 11524747 777
chr11 11521339 11587607 chr11 11555497 11559868 4371
chr11 11521339 11587607 chr11 11560639 11562128 1489
chr11 11521339 11587607 chr11 11564617 11565370 753
だから必要なのは、5列(column5/column5...)、6列(column6/column6...)、7列(column/column7)の値を連結することです...私が最初にあれば3列に一致アイテムがあります。 4列も保管したいのですが、逃しても大丈夫です。
出力は次のようになります。
chr1 69744110 69793325 . -1 -1 0
chr1 82791976 82791976 chr1 82792114/82816285/82828015 82792615/82817077/82829891 501/792/1876
chr1 88599340 88658398 . -1 -1 0
chr1 137772945 137830035 . -1 -1 0
chr1 137875312 137920590 . -1 -1 0
chr1 193433080 193446861 . -1 -1 0
chr10 26483800 26501370 chr10 26484794 26485295 501 (...)
chr10 117904141 117947090 chr10 117905334/117918966/117926867 117906320/117919852/117927368 986/886/501
(...)
何度も実験した結果、私ができる最善の方法は次のとおりです。
awk '{ k=$1 FS $2 FS $3; a[k]=(k in a)? a[k]"/"$5 : $5 }
END{ for(i in a) {
split(i,b,FS); b[5]=a[i]"\t"b[5]; r="";
for(j=1;j<=NF;j++) {
r=(r!="")? r"\t"b[j] : b[j]
}
print r}
}' input.bed > output.bed
ただし、これにより値が失われ、複数の列を結合できなくなります。
助けてください?
編集する:
新しい試み:
awk -F'\t' -v OFS='\t' '{
if ($2 in a) {
a[$2] = a[$2]";"$5;
b[$2] = b[$2]";"$6;
} else {
a[$2] = $5;
b[$2] = $6;
}
}
END { for (i in a) print i, a[i], b[i] }' input.bed > output.bed
ただし、評価されていないフィールドは引き続き失われます。
ベストアンサー1
awkを使用してください。残念ながら、awkには配列接続機能が組み込まれていませんが、gawkオンラインマニュアルには配列接続を作成する方法の例があります。
これがファイルにある場合aggregate.awk
(入力ファイルがタブで区切られているとします)
BEGIN {
FS = OFS = "\t"
}
# ref https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html#Join-Function
function join(array, start, end, sep, result, i)
{
if (sep == "")
sep = " "
else if (sep == SUBSEP) # magic value
sep = ""
result = array[start]
for (i = start + 1; i <= end; i++)
result = result sep array[i]
return result
}
function print_record() {
last_line[5] = join(col5, 1, n, "/")
last_line[6] = join(col6, 1, n, "/")
last_line[7] = join(col7, 1, n, "/")
print join(last_line, 1, NF, OFS)
}
{
key = $1 OFS $2 OFS $3
}
key != prev_key {
if (n > 0) {
print_record()
}
delete col5
delete col6
delete col7
n = 0
}
{
n++
col5[n] = $5
col6[n] = $6
col7[n] = $7
prev_key = key
split($0, last_line)
}
END {print_record()}
それから私達は次を持っています:
$ awk -f aggregate.awk input.bed
chr1 69744110 69793325 . -1 -1 0
chr1 82791976 82831348 chr1 82792114/82816285/82828015 82792615/82817077/82829891 501/792/1876
chr1 88599340 88658398 . -1 -1 0
chr1 137772945 137830035 . -1 -1 0
chr1 137875312 137920590 . -1 -1 0
chr1 193433080 193446861 . -1 -1 0
chr10 26483800 26501370 chr10 26484794 26485295 501
chr10 68069913 68089436 . -1 -1 0
chr10 95098349 95113967 . -1 -1 0
chr10 97310211 97335589 . -1 -1 0
chr10 111083097 111118237 chr10 111088928 111090274 1346
chr10 117904141 117947090 chr10 117905334/117918966/117926867 117906320/117919852/117927368 986/886/501
chr11 11521339 11587607 chr11 11523970/11555497/11560639/11564617 11524747/11559868/11562128/11565370 777/4371/1489/753