문자열을 인접한 문자열로 교체

문자열을 인접한 문자열로 교체

내 Linux 시스템에 여러 줄로 구성된 파일이 있으며 구조는 다음과 같습니다.

에스    이름.비계시작 치수 방향 길이 순서

나는 그것을로 바꿔야 해.

에스 비계. 비계시작 치수 방향 길이 순서

예를 들어 다음과 같이 변경합니다.

s       Sapo.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       Rana.RANA1        9000   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       Coqu.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

도착하다:

s       scaffold_1.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1             9000   10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

감사해요!

답변1

sed 's/[[:alnum:]]*\.\([[:alnum:]_.]*\)/\1.\1/' file

그러면 영숫자 문자 집합으로 시작하고 그 뒤에 점이 오는 문자열을 찾습니다. 이 줄은 삭제됩니다. 그 뒤에는 영숫자, 점, 밑줄로 구성된 문자열이 와야 합니다. 이것은 모두 중간에 점이 있는 표현식의 두 번째 부분으로 두 번 대체됩니다.

문제의 데이터를 고려하면 다음과 같은 결과가 나옵니다.

s       scaffold_1.scaffold_1   19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1     9000    10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5   19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8   19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1   68900   10      +       13588361        ATAATAAAAT

이는 "이름"이 일치 [[:alnum:]]*하고 "비계"가 일치한다고 가정합니다 [[:alnum:]_.]*.

약간 "현학적"인 정규식은 다음과 같습니다.

sed 's/[[:alnum:]]\{1,\}\.\([[:alnum:]]\{1,\}\([._][[:digit:]]\{1,\}\)\{0,1\}\)/\1.\1/' file

점 양쪽의 하위 문자열은 비워둘 수 없으며 스캐폴드 접미사( _1또는 .1등)는 선택적으로 스캐폴드 이름과 별도로 일치됩니다.

확장된 정규식(아마도 읽기 쉬움)으로서 이는 다음과 같이 작성됩니다.

sed -E 's/[[:alnum:]]+\.([[:alnum:]]+([._][[:digit:]]+)?)/\1.\1/' file

이는 주어진 데이터에 대한 첫 번째 명령과 동일한 출력을 생성합니다.

답변2

awk '{
    sub(/[^.]*\./,"",$2) #From the 2nd field, remove all up to first dot
    $2=$2"."$2           #Replicate the resulting second field
    print
}' file | column -t

산출:

s  scaffold_1.scaffold_1  19037  10  +  13588361  ATAATAAAAT
s  RANA1.RANA1            9000   10  +  13588361  ATAATAAAAT
s  scaffold_5.scaffold_5  19037  10  +  13588361  ATAATAAAAT
s  scaffold_8.scaffold_8  19037  10  +  13588361  ATAATAAAAT
s  SGBE0296.1.SGBE0296.1  68900  10  +  13588361  ATAATAAAAT

답변3

이 시도,

awk -F '\t' '{$2=gensub(/\w+\.(.*)/,"\\1.\\1","g",$2);}1' file | column -t

s  scaffold_1.scaffold_1  19037  10  +  13588361  ATAATAAAAT
s  RANA1.RANA1            9000   10  +  13588361  ATAATAAAAT
s  scaffold_5.scaffold_5  19037  10  +  13588361  ATAATAAAAT
s  scaffold_8.scaffold_8  19037  10  +  13588361  ATAATAAAAT
s  SGBE0296.1.SGBE0296.1  68900  10  +  13588361  ATAATAAAAT

관련 정보