sed 예기치 않은 추가 출력 [닫기]

sed 예기치 않은 추가 출력 [닫기]

Newick 형식의 여러 텍스트 파일을 편집하려고 합니다. 이를 위해 유전자 이름(제거하고 싶은)에 밑줄로 연결된 종 이름(유지하고 싶은)이 있습니다.

따라서 다음과 같이 시작하십시오.

(Species_A_Some_Gene_Code:0.1,Species_B_GeneCode:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);

나는 다음과 같은 것을 얻고 싶습니다 :

(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D:0.4):0.5);

제가 현재 사용하고 있는 sed방법은 bash. 종명을 포함하여 첫 번째 콜론( )까지 일치시키려고 하는데 :, 종명과 콜론 사이의 내용을 버려요.

for i in Species_A Species_B Species_C Species_D; do 
sed -i 's;\('"$i"'\)[^:]*\(:.*\);\1\2;p' "/directory/*.txt"
done

내가 얻은 것은...이상한 것이었나요? 실제 결과는 훨씬 크기 때문에 말하기 어렵지만 다음과 같습니다.

(Species_A:0.1,Species_B_GeneCode:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C_Code:0.3,Species_D:0.4):0.5);

이전 결과를 대체하는 대신 결과가 추가되는 것과 같습니다. 나는 이것이 두 번째 그룹이 일치시키려는 것과 관련이 있을 것이라고 생각 sed하지만 확실하지 않습니다. 귀하의 도움에 감사드립니다!

답변1

반드시 그럴까요 sed? 이건 어때 awk:

awk '
NR==1   {m = split ($0, T)
     next
    }
    {for (i=m; i; i--) sub(T[i] "[^:]*", T[i])
    }
1
' - file <<< "Species_A Species_B Species_C Species_D"
(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D:0.4):0.5);

이는 split"여기 문자열"을 배열로 읽는 것과 같습니다 T. 그런 다음 파일에서 읽은 각 줄에 대해 T해당 요소와 ":"가 아닌 문자로 구성된 모든 문자열을 대체하여 T":"char"가 아닌 문자를 효과적으로 제거합니다. :" 무엇.

관련 정보