Я пытаюсь удалить текст до и после различных разделителей, только в определенном столбце, столбец 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
Правильно, и только для полноты, поскольку это может иметь значение для ОП, учитывая его данные образца - выше будет удаляться до последней точки с запятой и от первой запятой, а 'gsub (/^[^;] *; | , [^,] * $ /, "", $ 3) 'будет удаляться до первой точки с запятой и от последней запятой. Кроме того, для сохранения пробела OP может работать на всей записи вместо одного поля 'sub (/ [^ [: space:]] +; /," "); к югу (/, [^ [: пространство:]] + /, "") '. –
@ Благодарим вас, обновите, включите свой совет и добавьте неприятный вариант sed, который сохраняет пробелы. –
@EdMorton @TomFenech Спасибо за помощь. Я включил 'awk '{gsub (/^.*; |,. * $ /," ", $ 3)} 1' b', поскольку входной файл был фактически разделен на вкладку. 'sed -E 's/^ (([^] + +) {2}) [^;] +; ([^,] +) (, [^] +) */\ 1 \ 3 /'' a > b ничего не меняет, даже если вместо пробела \ t. – Sarah