разделение и перемещение определенного столбца в файле с разделителями табуляции - PullRequest
0 голосов
/ 09 мая 2018

Я хотел разделить 7-й столбец (header-otherinfo), как показано ниже, на «:», а затем вставить четвертый, шестой и седьмой символы из этого разделенного столбца после второго столбца как отдельные столбцы с разными заголовками.

Входной файл будет таким с несколькими строками

Chr Start   End Ref Alt Func.   otherinfo
1   21  32  T   C   int 0/1:71:67:66:45:21:31.82%:7.1741E-8:33:34:45:0:21:0
2   22  31  T   C   int 0/1:77:45:44:22:21:48.84%:1.8298E-8:31:35:22:0:21:0
3   23  30  T   C   int 0/1:87:40:38:9:21:70%:1.7919E-9:32:36:9:0:21:0
4   24  29  G   T   int 0/1:68:23:23:3:15:65.22%:1.4655E-7:40:33:3:0:15:0
5   25  28  C   T   int 1/1:55:17:17:4:13:76.47%:2.5647E-6:30:21:4:0:13:0
6   26  27  T   C   int 1/1:60:15:15:2:13:86.67%:8.7675E-7:38:24:2:0:13:0
7   27  26  C   T   int 0/1:181:1067:1067:1003:64:6%:6.9582E-19:39:39:1003:0:64:0
8   28  25  C   A   int 1/1:46:9:9:0:9:100%:2.0568E-5:0:38:0:0:9:0
9   29  24  T   A   int 0/1:255:356:356:170:186:52.25%:3.2158E-71:40:40:0:170:0:186
10  30  23  T   G   int 1/1:41:8:8:0:8:100%:7.77E-5:0:40:0:0:0:8
11  31  22  G   A   int 0/1:148:92:92:51:41:44.57%:1.387E-15:40:39:51:0:41:0
12  32  21  G   C   int 0/1:122:51:51:20:31:60.78%:5.6397E-13:36:35:20:0:31:0

тогда как выходной файл должен выглядеть следующим образом

Chr Start   RD  AD  Per End Ref Alt Func.
1   21  66  21  31.82%  32  T   C   int
2   22  44  21  48.84%  31  T   C   int
3   23  38  21  70% 30  T   C   int
4   24  23  15  65.22%  29  G   T   int
5   25  17  13  76.47%  28  C   T   int
6   26  15  13  86.67%  27  T   C   int
7   27  1067    64  6%  26  C   T   int
8   28  9   9   100%    25  C   A   int
9   29  356 186 52.25%  24  T   A   int
10  30  8   8   100%    23  T   G   int
11  31  92  41  44.57%  22  G   A   int
12  32  51  31  60.78%  21  G   C   int

Я пытался использовать awk для разделения

awk 'BEGIN {OFS=FS="\t"} {gsub(/\:/,"\t",$7)}1' input.txt >> output.txt

и получил этот вывод

Chr Start   End Ref Alt Func.   otherinfo
    1   21  32  T   C   int 0/1:71:67:66:45:21:31.82%:7.1741E-8:33:34:45:0:21:0
    2   22  31  T   C   int 0/1:77:45:44:22:21:48.84%:1.8298E-8:31:35:22:0:21:0
    3   23  30  T   C   int 0/1:87:40:38:9:21:70%:1.7919E-9:32:36:9:0:21:0
    4   24  29  G   T   int 0/1:68:23:23:3:15:65.22%:1.4655E-7:40:33:3:0:15:0
    5   25  28  C   T   int 1/1:55:17:17:4:13:76.47%:2.5647E-6:30:21:4:0:13:0
    6   26  27  T   C   int 1/1:60:15:15:2:13:86.67%:8.7675E-7:38:24:2:0:13:0
    7   27  26  C   T   int 0/1:181:1067:1067:1003:64:6%:6.9582E-19:39:39:1003:0:64:0
    8   28  25  C   A   int 1/1:46:9:9:0:9:100%:2.0568E-5:0:38:0:0:9:0
    9   29  24  T   A   int 0/1:255:356:356:170:186:52.25%:3.2158E-71:40:40:0:170:0:186
    10  30  23  T   G   int 1/1:41:8:8:0:8:100%:7.77E-5:0:40:0:0:0:8
    11  31  22  G   A   int 0/1:148:92:92:51:41:44.57%:1.387E-15:40:39:51:0:41:0
    12  32  21  G   C   int 0/1:122:51:51:20:31:60.78%:5.6397E-13:36:35:20:0:31:0

Пожалуйста, дайте мне знать, если я смогу это сделать?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

это ...

$ awk 'NR==1 {$2=$2 FS "RD AD Per"; NF--} 
       NR>1  {split($7,a,":"); NF--; 
              $2=$2 FS a[4] FS a[6] FS a[7]}1' file | column -t

Chr  Start  RD    AD   Per     End  Ref  Alt  Func.
1    21     66    21   31.82%  32   T    C    int
2    22     44    21   48.84%  31   T    C    int
3    23     38    21   70%     30   T    C    int
4    24     23    15   65.22%  29   G    T    int
5    25     17    13   76.47%  28   C    T    int
6    26     15    13   86.67%  27   T    C    int
7    27     1067  64   6%      26   C    T    int
8    28     9     9    100%    25   C    A    int
9    29     356   186  52.25%  24   T    A    int
10   30     8     8    100%    23   T    G    int
11   31     92    41   44.57%  22   G    A    int
12   32     51    31   60.78%  21   G    C    int
0 голосов
/ 09 мая 2018

После awk может помочь вам в том же.

awk 'FNR==1{print "Chr\tStart\tRD\tAD\tPer\tEnd\tRef\tAlt\tFunc.";next}{split($NF,array,":");$2=$2 OFS array[4] OFS array[6] OFS array[7];$NF=""} 1' OFS="\t"  Input_file

Пожалуйста, измените awk на awk -F"\t" для разделителей TAB и измените Input_file на OFS="\t" Input_file для выходных разделителей TAB в приведенном выше коде. Также, чтобы получить вывод в выходной файл, используйте > output_file в конце кода выше.

Теперь добавляем не одну линейную форму решения.

awk '
FNR==1{
  print "Chr\tStart\tRD\tAD\tPer\tEnd\tRef\tAlt\tFunc.";
  next}
{
  split($NF,array,":");
  $2=$2 OFS array[4] OFS array[6] OFS array[7];
  $NF=""}
1
' OFS="\t"   Input_file
...