前のフィールドに一致する項目がある場合は、列を水平方向に結合します。結合する複数の列

前のフィールドに一致する項目がある場合は、列を水平方向に結合します。結合する複数の列

したがって、次のようないくつかの署名マーカー(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

おすすめ記事