Intereting Posts
Не удается получить доступ к веб-сайту из других сетей Предотвратить передачу IGP dom0 из VGA-переданного на хост HVM с Xen4.4 Могу ли я разбить жесткий блок на жестком диске? Напишите правило udev из рецепта битбокса резервное копирование: какие исправления для резервного копирования перед обновлением / переустановкой Файловая система загрузочного диска Где подходящее место для развертывания веб-приложений? Мониторинг прогресса / доступности фоновых заданий Почему я должен запускать alsactl init каждый раз, когда я загружаю свою систему? Вносить записи пользователя в / etc / hosts постоянными Открытый ключ не работает … но он совпадает с ключом хоста Низкое разрешение, вызванное Нет допустимых режимов для «DFP-0» – Mint-17 NVidia ssh_exchange_identification: соединение закрыто удаленным хостом Команда Mac Terminal – поиск строки и печать с помощью окружения Каков эффект «$ {(@ f) …}» в Zsh?

Удаление расширения только из первого столбца

У меня есть файл, подобный этому, с разделенными вкладками двумя столбцами:

ENSG00000242268.2 0.07563 ENSG00000270112.3 0.09976 ENSG00000167578.15 4.38608 ENSG00000273842.1 0.0 ENSG00000078237.5 4.08856 

Я хотел бы удалить числовые расширения с конца в 1-м столбце, поэтому вывод будет:

  ENSG00000242268 0.07563 ENSG00000270112 0.09976 ENSG00000167578 4.38608 ENSG00000273842 0.0 ENSG00000078237 4.08856 

Просто sed 's/\..*$//' возвращает только первое значение столбца и использует awk с разделителем полей '.' , awk -F'.' удаляет значения из второго столбца, так как есть десятичные числа.

На подобный вопрос был дан ответ: удаление расширений в столбце

Я все еще не могу удалить только из столбца 1.

Решение awk :

 awk -F'\t' '{sub(/\..+$/,"",$1)}1' OFS='\t' file 
  • -F'\t' – разделитель полей

  • sub(/\..+$/,"",$1) – удаляет . со следующими символами из 1-го поля одновременно

Выход:

 ENSG00000242268 0.07563 ENSG00000270112 0.09976 ENSG00000167578 4.38608 ENSG00000273842 0.0 ENSG00000078237 4.08856 

Или с помощью простого подхода sed :

 sed 's/\.[0-9]*//' file 

просто делать:

 sed 's/\(.[0-9]\+\) / /' 

он будет соответствовать только первой десятичной части и удалит ее.

на ваш образец:

 echo "ENSG00000242268.2 0.07563 > ENSG00000270112.3 0.09976 > ENSG00000167578.15 4.38608 > ENSG00000273842.1 0.0 > ENSG00000078237.5 4.08856" | sed 's/\(.[0-9]\+\) / /' ENSG00000242268 0.07563 ENSG00000270112 0.09976 ENSG00000167578 4.38608 

если у вас есть вкладки, попробуйте это:

 sed 's/\(.[0-9]\+\)\( \|\t\)\2/' 

Мы можем сопоставить версированный человеческий ген Ensembl «стабильный» идентификатор с расширенным регулярным выражением ENSG[0-9]{11}\.[0-9]+ .

Используя это с sed :

 $ sed -r 's/(ENSG[0-9]{11})\.[0-9]+/\1/' file.in >file.out 

Это не зависит от разделителя между столбцами или где на линии возникает идентификатор.

 $ awk -F'[\t.]' -v OFS='\t' '{print $1,$3 "." $4}' ENSG00000242268 0.07563 ENSG00000270112 0.09976 ENSG00000167578 4.38608 ENSG00000273842 0.0 ENSG00000078237 4.08856 

С помощью Bash с помощью удаления подстроки :

 #!/usr/bin/env bash file='file.txt' while read -ri; do a=$( <<< "${i}" cut -d $'\t' -f 1 ) a=${a%.*} b=$( <<< "${i}" cut -d $'\t' -f 2- ) printf '%s\t%s\n' "${a}" "${b}" done < "${file}" 

Решение Perl :

perl -pe 's/\.\d+//

  • \.\d+ соответствует первому '.' после чего следует 1 или более цифр.
  • s/pattern// удалит выбранный шаблон.