2013-08-29 2 views
1

У меня есть большой файл с разделителями табуляции, содержащий 80 или около колонны, выглядит следующим образом:Split один столбец в строках

184  
2  
P 2853263 4998463 
SS  
AG0001-C   
T/T  C/C  A/A 
AG0002-C   
T/T  C/C  A/T 
AG0003-C   
T/T  C/C  A/A 
AG0004-C   
T/T  C/C  T/A 

Я хочу заменить косой черты («\») к новой линии так что содержание одного столбца разделены на две строки следующим образом:

184  
2  
P 2853263 4998463 
SS  
AG0001-C   
T  C   A 
T  C   A 
AG0002-C   
T  C   A 
T  C   T 
AG0003-C   
T  C   A 
T  C   A 
AG0004-C   
T  C   T 
T  C   A 
+0

Прошу прощения за каждого, я допустил ошибку в том, что я хотел, чтобы мой результат был. Теперь я внесла поправки в правильный формат. – 714

ответ

3

Для ввода, как это (без начальных вкладки в левой части первой колонны):

184 
2 
P 2853263 4998463 
SS 
AG0001-C 
T/T C/C A/A 
AG0002-C 
T/T C/C A/T 
AG0003-C 
T/T C/C A/A 
AG0004-C 
T/T C/C T/A 

Этот сценарий должен работать с Mawk:

#!/usr/bin/awk -f 

NR <= 4 || NR % 2 { print; next; } 
{ 
    rows = 0 
    for (i = 1; i <= NF; ++i) { 
     count = split($i, b, /\//) 
     if (count > rows) { 
      rows = count 
     } 
     for (j = 1; j <= count; ++j) { 
      key = i "|" j 
      a[key] = b[j] 
     } 
    } 
    for (i = 1; i <= rows; ++i) { 
     key = 1 "|" i 
     printf("%s", a[key]) 
     for (j = 2; j <= NF; ++j) { 
      key = j "|" i 
      printf("\t%s", a[key]) 
     } 
     print "" 
    } 
    for (i in a) { 
     delete a[i] 
    } 
} 

Выход:

184 
2 
P 2853263 4998463 
SS 
AG0001-C 
T C A 
T C A 
AG0002-C 
T C A 
T C T 
AG0003-C 
T C A 
T C A 
AG0004-C 
T C T 
T C A 

It shoul d работа даже с различными форматами, как это:

184 
2 
P 2853263 4998463 
SS 
AG0001-C 
A/A/C/X/Y/Z T/T C/C A/A A/A/C/X A/A/B A/A/C/X/Y 
AG0002-C 
T/T C/C A/T 
AG0003-C 
T/T C/C A/A 
AG0004-C 
T/T C/C T/A 

Выход:

184 
2 
P 2853263 4998463 
SS 
AG0001-C 
A T C A A A A 
A T C A A A A 
C    C B C 
X    X  X 
Y      Y 
Z      
AG0002-C 
T C A 
T C T 
AG0003-C 
T C A 
T C A 
AG0004-C 
T C T 
T C A 

Для входа с вкладках слева:

184 
    2 
    P 2853263 4998463 
    SS 
    AG0001-C 
    T/T C/C A/A 
    AG0002-C 
    T/T C/C A/T 
    AG0003-C 
    T/T C/C A/A 
    AG0004-C 
    T/T C/C T/A 

Этот код

#!/usr/bin/awk -f 

NR <= 4 || NR % 2 { print; next; } 
{ 
    rows = 0 
    for (i = 1; i <= NF; ++i) { 
     count = split($i, b, /\//) 
     if (count > rows) { 
      rows = count 
     } 
     for (j = 1; j <= count; ++j) { 
      key = i "|" j 
      a[key] = b[j] 
     } 
    } 
    for (i = 1; i <= rows; ++i) { 
     for (j = 1; j <= NF; ++j) { 
      key = j "|" i 
      printf("\t%s", a[key]) 
     } 
     print "" 
    } 
    for (i in a) { 
     delete a[i] 
    } 
} 

Дал бы результат

184 
    2 
    P 2853263 4998463 
    SS 
    AG0001-C 
    T C A 
    T C A 
    AG0002-C 
    T C A 
    T C T 
    AG0003-C 
    T C A 
    T C A 
    AG0004-C 
    T C T 
    T C A 
+0

Это работает, однако, когда добавляются дополнительные столбцы ~ 80 столбцов, сценарий не ведет себя одинаково – 714

+0

@ 714 Оказывается, я ошибся, указав NF как NR. Теперь это исправлено. – konsolebox

+0

Спасибо, он работал как шарм! – 714

2

GNU awk решение:

$ awk '/[/]/{print $1,$3,$6;print $2,$4,$6;next}1' FS='/| +' OFS='\t' file 
184 
2 
P 2853263 4998463 
SS 
AG0001-C 
T  C  A 
T  C  A 
AG0002-C 
T  C  T 
T  C  T 
AG0003-C 
T  C  A 
T  C  A 
AG0004-C 
T  C  A 
T  C  A 
+0

Я получаю следующее сообщение об ошибке: awk: строка 1: сбой регулярного выражения не сработал (плохой класс - [], [^] или [) [ awk: строка 1: ошибка синтаксиса около или около] – 714

+0

Почему вы находитесь на и какая версия awk у вас есть? –

+0

Я использую ubuntu, и у меня есть mawk – 714

1

Использование 0 не:

$ sed -e "s|/|\t|g" -e "s/\([^\t]*\t[^\t]*\t[^\t]*\)\t\(.*\)/\1\n\2/" inputfile 
184 
2 
P 2853263 4998463 
SS 
AG0001-C 
T T C 
C A A 
AG0002-C 
T T C 
C A T 
AG0003-C 
T T C 
C A A 
AG0004-C 
T T C 
C T A 
0

Это может работать для вас (GNU СЭД):

sed '/\//!b;h;s|/.||g;G;s|./||g' file 

Для строк, содержащих / скопировать строку. Удалите / и следующий символ. Добавьте скопированную строку и удалите символ до любого /.

Смежные вопросы