2016-03-22 1 views
0

Я пытаюсь удалить текст до и после различных разделителей, только в определенном столбце, столбец 3.AWK к югу в указанном столбце

Первый разделитель запятая, вторая запятая. Они также существуют в нераскрытых столбцах.

Входные данные:

chr2L 54273 2L_54273_SNP;rs203207895  A  G  999  PASS ALTCOUNT=118;DB;REFCOUNT=69  GT  ./.  ./.  0/0 
chr2L 54339 2L_54339_SNP;rs206877787,rs80377533  T  A  999  PASS ALTCOUNT=114;DB;REFCOUNT=73  GT  ./.  ./. 
chr2L 54587 2L_54587_SNP;rs203534836  A  G  999  PASS ALTCOUNT=5;DB;REFCOUNT=199  GT  0/0  0/0  0/0 

Требуемая мощность:

chr2L 54273 rs203207895  A  G  999  PASS ALTCOUNT=118;DB;REFCOUNT=69  GT  ./.  ./.  0/0 
chr2L 54339 rs206877787  T  A  999  PASS ALTCOUNT=114;DB;REFCOUNT=73  GT  ./.  ./. 
chr2L 54587 rs203534836  A  G  999  PASS ALTCOUNT=5;DB;REFCOUNT=199  GT  0/0  0/0  0/0 

Мои усилия были сосредоточены на только удаление текста перед (включительно) с запятой, но без каких-либо существенных результатов:

awk '{ if ($3 == ".*\;//") {$3 = ""; print} else { print }; }' <a> b 
sed 's/.*;//' a > b 
awk '{ sub(/*.;/,"",$3) }1 ' <a> b 
awk '{sub(;/./*,""); print}' <a> b 

ответ

1

Я думаю, что вы можете использовать что-то вроде этого:

awk '{ gsub(/^.*;|,.*$/, "", $3) }1' file 

Это соответствует любому типу от начала третьего поля до точки с запятой или от запятой до конца поля и заменяет их пустой строкой.

Одна из ваших проблем заключалась в том, что вы использовали *. (неправильный синтаксис), а не .* (ноль или более любого символа).

Как было отмечено в комментариях (спасибо), вы можете сделать шаблон немного более строгим, например:

/^[^;]*;|,[^,]*$/ 

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

Если вход разделенной табуляции, то вы можете сохранить пространство, поручив AWK этого:

awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", $3) } 1' file 

FS и OFS являются переменными, используемым для установки входных и выходных разделителей поле.

+1

Правильно, и только для полноты, поскольку это может иметь значение для ОП, учитывая его данные образца - выше будет удаляться до последней точки с запятой и от первой запятой, а 'gsub (/^[^;] *; | , [^,] * $ /, "", $ 3) 'будет удаляться до первой точки с запятой и от последней запятой. Кроме того, для сохранения пробела OP может работать на всей записи вместо одного поля 'sub (/ [^ [: space:]] +; /," "); к югу (/, [^ [: пространство:]] + /, "") '. –

+1

@ Благодарим вас, обновите, включите свой совет и добавьте неприятный вариант sed, который сохраняет пробелы. –