2012-07-03 3 views
2

У меня есть файл с линиями как так:с использованием AWK SUBSTR

1  17  A  G  R:560:500:60:10.71%:1.6329E-19 Pass:1.0:276:0:57:0:1E0 15  17  0  0  R:24:20:4:16.67%:5.461E-2 R:22:20:2:9.09%:2.4419E-1 R:27:24:3:11.11%:1.1792E-1 R:26:23:3:11.54%:1.1765E-1 A:16:16:0:0%:1E0 A:23:23:0:0%:1E0 A:11:10:1:9.09%:5E-1 
1  36  C  T  Y:560:499:61:10.89%:7.7026E-20 Pass:1.0:275:0:58:0:1E0 15  17  0  0  Y:24:20:4:16.67%:5.461E-2 Y:22:20:2:9.09%:2.4419E-1 Y:27:24:3:11.11%:1.1792E-1 Y:26:23:3:11.54%:1.1765E-1 C:16:16:0:0%:1E0 C:23:23:0:0%:1E0 C:11:10:1:9.09%:5E-1 

Я ранее с помощью следующей AWK на лайнере, чтобы извлечь первый символ каждого поля от $ 11 и выше.

awk '{n=11; while (n<18) {{$n = substr($n, 0, 1)} n++} print $0}' 

Я ищу простой способ изменить его, так что я могу извлечь только проценты от этих fileds (значения после 4-го двоеточия поля). Результат будет выглядеть так:

1  17  A  G  R:560:500:60:10.71%:1.6329E-19 Pass:1.0:276:0:57:0:1E0 15  17  0  0  16.67% 9.09% 11.11% 11.54% 0% 0% 9.09% 
1  36  C  T  Y:560:499:61:10.89%:7.7026E-20 Pass:1.0:275:0:58:0:1E0 15  17  0  0  16.67% 9.09% 11.11% 11.54% 0% 0% 9.09% 

Cheers.

ответ

2

Это напечатает процент включая «%»:

split($5, arr, ":"); print arr[5] 

Отрегулировать номер поля в split() заявлении в соответствии с вашими данными.

Вам не нужно использовать цикл while и управлять переменной increment самостоятельно, просто используйте цикл for. Вот полный, рабочий сценарий, используя технику, показанную выше, и for цикл:

awk 'BEGIN {OFS = "\t"} {for (n = 11; n < 18; n++) {split($n, arr, ":"); $n = arr[5]}; print $0}' 

Пример вывода:

1 17 A G R:560:500:60:10.71%:1.6329E-19 Pass:1.0:276:0:57:0:1E0 15 17 0 0 16.67% 9.09% 11.11% 11.54% 0% 0% 9.09% 
1 36 C T Y:560:499:61:10.89%:7.7026E-20 Pass:1.0:275:0:58:0:1E0 15 17 0 0 16.67% 9.09% 11.11% 11.54% 0% 0% 9.09% 
+0

AWK «{п = 11; while (n <18) {{$ n = substr ($ n, 0, 1)} n ++} print $ 0} ' – user1308144

+0

У меня возникли проблемы с его включением в awk один вкладыш. awk '{n = 11; while (n <18) {{$ n = split ($ n, arr, ":")} n ++} print $ 0} 'дает мне только количество элементов в каждом массиве. – user1308144

+0

@ user1308144: См. Мой отредактированный ответ. 'split()' помещает результаты в именованный массив и возвращает количество частей. –

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