Intereting Posts

Заменить значения в столбце, содержащем числа

У меня есть файл, который выглядит так:

chrom start stop strand isoform mu_codon mut_codon2 more_info chr22 43089055 43089055 - NM_017436 C 300 903delC chr22 43089715 43089717 - NM_017436 CTT 79 241_243delTTC chr12 53701873 53701875 - NM_015665 TTC A 1292_1294delTTCinsA 

Я хочу заменить значения в 7-м столбце пробелом, если они содержат число, а не букву.

Например, вот мой желаемый результат:

 chrom start stop strand isoform mu_codon mut_codon2 more_info chr22 43089055 43089055 - NM_017436 C 903delC chr22 43089715 43089717 - NM_017436 CTT 241_243delTTC chr12 53701873 53701875 - NM_015665 TTC A 1292_1294delTTCinsA 

Мне нужно сохранить пространство в моем файле, чтобы мои столбцы не были изменены. Любая идея о том, как это сделать? Может быть, awk ? Я все еще изучаю эти методы. Можете ли вы объяснить свои ответы?

Поскольку вы хотите сохранить свои столбцы, вы можете изменить разделитель выходных полей, например, на tab не на space и будет проще для дальнейшей обработки, если вы будете полагаться на подсчет столбцов. Таким образом, вы можете использовать следующий awk :

 awk 'BEGIN { OFS = "\t"; }; { if ($7 ~ "^[0-9]*$") $7 = " "; else $7 = $7; }; 1' 

В разделе BEGIN мы меняем разделитель полей вывода ( OFS ) на tab . В следующем разделе мы проверяем, содержит ли 7- го числа только числа, и если да, мы изменим значение на space , если не сохраним значение. Но при $7 = $7 мы уверены, что мы реконструируем текущую строку (запись) из-за изменения OFS . Изменение OFS обеспечивает дальнейшую обработку с помощью awk что вывод будет содержать 8 столбцов, если разделитель полей ( FS ) установлен на tab .

 sed -e's/ *[^ 0-9]*/&\n/6;:n' \ -e's/\(\n[^ ]*\)[^ ]/\1 /;tn' \ -e's/\n//' <infile 

Вот несколько sed чтобы сделать это. Первое, что мы делаем, – это заменить 6-е появление одного или нескольких пробелов, за которым следует последовательность из нуля или более [^ 0-9] не-пробелов или числовых символов, за которыми следует новая строка.

В основном это означает, что если 7-й столбец состоит исключительно из символов, отличных от пробелов или чисел, sed добавит к нему новую строку, иначе sed добавит к нему новую строку.

В следующем утверждении мы заменяем все непространственные символы сразу же после новой строки в пространстве шаблонов с символом пробела каждый. Конечно, это происходит совсем не так, когда в новой строке еще не пробегает символ пробела, как это будет, если седьмой столбец не является числовым.

Наконец, мы удаляем вставленный разделитель новой строки.

ВЫВОД

 chrom start stop strand isoform mu_codon mut_codon more_info chr22 43089055 43089055 - NM_017436 C 903delC chr22 43089715 43089717 - NM_017436 CTT 241_243delTTC chr12 53701873 53701875 - NM_015665 TTC A 1292_1294delTTCinsA 
 awk '{gsub("^[0-9]*$"," ",$7);$7=$7;OFS="\t";print}' file.txt 

Перл на помощь:

 #!/usr/bin/perl use warnings; use strict; while (<>) { # Process line by line. my @F = split /(\s+)/; # Split the line into @F, keep whitespace as members, too. $F[12] =~ s/./ /g # Replace any character with space if $F[12] =~ /^[0-9]+$/; # if there are just digits. print @F; # Print the result. }