вырезать определенные столбцы из нескольких файлов и изменять их, используя инструменты Unix - PullRequest
4 голосов
/ 18 марта 2011

У меня есть несколько сотен файлов в папке. Каждый из этих файлов представляет собой текстовый файл с разделителями табуляции, который содержит более миллиона строк и 27 столбцов. Из каждого файла я хочу иметь возможность извлекать только определенные столбцы (скажем, вытащить только столбцы: 1,2,11,12,13). Столбцы 3:10 и 14:27 можно игнорировать. Я хочу иметь возможность сделать это для всех файлов в папке (скажем, 2300 файлов). Столбцы из каждого файла 2300 выглядят так ..........

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567890_A    rs758676    -     -      1              T                       T                 -     ....col27
1234567890_A    rs3916934   -     -      1              T                       T                 -     ....col27
1234567890_A    rs2711935   -     -      1              T                       C                 -     ....col27
1234567890_A    rs17126880  -     -      1              -                       -                 -     ....col27
1234567890_A    rs12831433  -     -      1              T                       T                 -     ....col27
1234567890_A    rs12797197  -     -      1              T                       C                 -     ....col27

Вырезанные столбцы из 2-го файла могут выглядеть следующим образом ...

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567899_C    rs758676    -     -      100            T                       A                 -     ....col27
1234567899_C    rs3916934   -     -      100            T                       T                 -     ....col27
1234567899_C    rs2711935   -     -      100            T                       C                 -     ....col27
1234567899_C    rs17126880  -     -      100            C                       G                 -     ....col27
1234567899_C    rs12831433  -     -      100            T                       T                 -     ....col27
1234567899_C    rs12797197  -     -      100            T                       C                 -     ....col27

Вырезанные столбцы из 3-го файла могут выглядеть следующим образом ...

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567999_F    rs758676    -     -      256            A                       A                 -     ....col27
1234567999_F    rs3916934   -     -      256            T                       T                 -     ....col27
1234567999_F    rs2711935   -     -      256            T                       C                 -     ....col27
1234567999_F    rs17126880  -     -      256            C                       G                 -     ....col27
1234567999_F    rs12831433  -     -      256            T                       T                 -     ....col27
1234567999_F    rs12797197  -     -      256            C                       C                 -     ....col27

Ширина Sample.ID, Sample.Index одинакова в каждом файле, но может изменяться между файлами. Значение Sample.ID одинаково для каждого файла, но различно для разных файлов. Каждый из файлов вырезки имеет одинаковые значения в столбце «SNP.Name». Столбец Sample.Index может иногда совпадать с другим файлом. Два других значения столбцов (Allele1...Forward & Allele2...Forward) могут изменяться и вставляться с "" sep под каждым SNP.Name для каждого Sample.ID.

Наконец-то я хочу объединить (удалить с табуляции) все вырезанные столбцы из 2300 файлов в этот формат ......

Sample.Index  Sample.ID     rs758676   rs3916934   rs2711935  rs17126880  rs12831433  rs12797197        
1             1234567890_A  T T         T T         T C         0 0         T T         T C        
200           1234567899_C  T A         T T         T C         C G         T T         T C        
256           1234567999_F  A A         T T         T C         C G         T T         C C        

Проще говоря, я хочу иметь возможность конвертировать длинный формат в широкоформатный на основе столбца Sample.ID. Это похоже на функцию reshape в R. Я пробовал это с R, и она исчерпывает память и работает очень медленно. Кто-нибудь может помочь с инструментами Unix?

Когда файл reshape.sh был применен к 20 файлам ... он выдал ложную «строку сэмплов» на выходе. Первые 4 поля показаны здесь.

Sample.Index    Sample.ID   rs476542    rs7073746   
1234567891_A          11         C C          A G   
1234567892_A         191         T C          A G   
1234567893_A         204         T C          G G   
1234567894_A          15         T C          A G   
1234567895_A         158         T T          A A   
1234567896_A         208         T C          A A   
1234567897_A         111         T T          G G   
1234567898_A         137         T C          G G   
1234567899_A         216         T C          A G   
1234567900_A         113         T C          G G   
1234567901_A         152         T C          A G   
1234567902_A         178         C C          A A   
1234567903_A         135         C C          A A   
1234567904_A         125         T C          A A   
1234567905_A         194         C C          A A   
1234567906_A         110         C C          G G   
1234567907_A         126         C C          A A   
Sample         -                                    
1234567908_A         169         C C          G G   
1234567909_A         173         C C          G G   
1234567910_A         168         T C          A A   

1 Ответ

5 голосов
/ 18 марта 2011
#!/bin/bash

awk '

BEGIN {
  maxInd = length("Sample.Index")
  maxID  = length("Sample.ID")
}

FNR>11 && $2 ~ "^rs" {
  SNP[$2]
  key[$11,$1]
  val[$2,$11,$1]=$12" "$13
  maxInd = (len=length($11)) > maxInd ? len : maxInd
  maxID  = (len=length($1))  > maxID  ? len : maxID
}

END {
  printf("%-*s\t%*s\t", maxInd, "Sample.Index", maxID, "Sample.ID")
  for (rs in SNP)
    printf("%s\t", rs)
  printf("\n")

  for(pair in key) {
    split(pair,a,SUBSEP)
      printf("%-*s\t%*s\t", maxInd, a[1], maxID, a[2])
      for(rs in SNP) {
        ale = val[rs,a[1],a[2]]
        out = ale == "- -" ||  ale == "" ? "0 0" : ale
        printf("%*s\t", length(rs), out)
      }
      printf("\n")
  }
}' DNA*.txt

Подтверждение концепции

$ ./reshapeDNA
Sample.Index       Sample.ID    rs2711935       rs10829026      rs3924674       rs2635442       rs715350        rs17126880      rs7037313       rs11983370      rs6424572       rs7055953       rs758676        rs7167305       rs12831433      rs2147587       rs12797197      rs3916934       rs11002902
11              1234567890_A          T T              0 0            C C             0 0            0 0               T C            0 0              C C            T G             0 0            C C              0 0              T C            A G              T T            T C              G G
111             1234567892_A          T T              T C            C C             0 0            0 0               C C            T C              C C            T T             0 0            C C              0 0              T T            A A              T T            T T              G G
1               1234567894_A          T T              0 0            T C             C C            A G               C C            0 0              C C            0 0             T C            C C              T T              T T            A G              T T            C C              G G
12              1234567893_A          T T              0 0            C C             T C            A A               T C            0 0              C C            0 0             T T            C C              T G              T C            A G              T T            T C              G G
15              1234567891_A          T T              C C            C C             0 0            0 0               C C            C C              C C            T T             0 0            C C              0 0              T C            A G              T T            T T              G G
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...