Удаление только части символьной строки в txt файле - строка chr

Я хотел бы удалить строки «chr» в следующем текстовом файле с помощью bash:

          FO538757.1      chr1:183937
    AL669831.3      chr1:601436
    AL669831.3      chr1:601667
    AL669831.3      chr1:609395
    AL669831.3      chr1:609407
    AL669831.3      chr1:611317

Итак, конечный файл выглядит так:

      FO538757.1      1:183937
AL669831.3     1:601436
AL669831.3     1:601667
AL669831.3     1:609395
AL669831.3     1:609407
AL669831.3     1:611317
  1. Я проверил предыдущие темы и попробовал:

            sed 's/^chr//' 
     awk 'BEGIN {OFS=FS="\t"} {gsub(/chr1/,"1",$2)}2'
    
  2. ни один из них не работал. Есть ли здесь лучший вариант, чем awk?

Спасибо!

4 ответа

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

      sed 's/chr//' file

Вы можете сделать это довольно легко с помощью sed и два выражения, (1) первое для удаления chr а второй - для удаления начальных пробелов, например

      sed -e 's/chr//' -e 's/^[[:blank:]]*//'  file

Пример использования / вывода

С вашим вводом в файл с именем file, вам придется

      $ sed -e 's/chr//' -e 's/^[[:blank:]]*//'  file
FO538757.1      1:183937
AL669831.3      1:601436
AL669831.3      1:601667
AL669831.3      1:609395
AL669831.3      1:609407
AL669831.3      1:611317

С вашими показанными образцами попробуйте следующее. Простое объяснение: замена начального chr на NULL во втором поле и печать строки, что приведет к восстановлению текущей строки, и начальные пробелы также будут удалены из строки.

      awk '{sub(/^chr/,"",$2)} 1' Input_file

Если ваш Input_file разделен табуляцией и имеет табуляции в начале файла, попробуйте следующее:

      awk 'BEGIN{FS=OFS="\t"} {sub(/^chr/,"",$3);sub(/^\t+/,"")} 1' Input_file

С помощью bashоболочка с расширением параметров и mapfile он же readarray

      #!/usr/bin/env bash

shopt -s extglob

mapfile -t array < file.txt

array=("${array[@]##+([[:space:]])}")

printf '%s\n' "${array[@]/chr}"

Внутри скрипта extglob должен быть включен, но в командной строке он может быть уже включен, поэтому в одну строку

      mapfile -t array < file.txt; array=("${array[@]##+([[:space:]])}"); printf '%s\n' "${array[@]/chr}"

Это будет очень медленно для большого набора данных / файлов, jfyi

Другие вопросы по тегам