sed는 정수 뒤의 구분 기호를 대체합니다.

sed는 정수 뒤의 구분 기호를 대체합니다.

파일 이름이 주어지면 chrIII:834297-835206:-.miRanda.txt최소 BED 형식(탭으로 구분된 데이터)을 생성하고 싶습니다.

chrIII  834297  835206  -

정수 다음에 첫 번째 구분 기호를 sed변환하라고 말하는 데 어려움을 겪고 있습니다 (즉, 두 번째 발생 시 체인 정보를 엉망으로 만들지 마세요). -내가 하려는 일은 echo *.miRanda.txt | sed 's/.miRanda.txt//g' | sed 's/:/\t/g; s/[0-9]-/\t/g'올바르지 않으며 누군가 도움을 줄 수 있다면 감사할 것입니다. (나는 [0-9]작업해야 할 어떤 패턴이 있다고 생각하지만 용어를 모르고 이것을 구글링하는 데 어려움을 겪고 있습니다.)

솔루션이 반드시 요구사항은 아닙니다 sed.

답변1

다음은 한 가지 방법입니다(GNU sed또는 기타 지원되는 방법 사용 -E).

$ echo chrIII:834297-835206:-.miRanda.txt |     
    sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):([^.]+).*/\1\t\2\t\3\t\4/'
chrIII  834297  835206  -

.이는 네 번째 필드(베드 파일의 이름)로 a를 가질 수 없다고 가정합니다 . 이것이 안전한 가정이 아니고 확장을 사용해야 하는 경우 다음을 수행할 수 있습니다.

$ echo chrIII:834297-835206:-.miRanda.txt | 
    sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):(.+)\.miRanda.txt/\1\t\2\t\3\t\4/'
chrIII  834297  835206  -

또한 최소 침대 형식에는 네 번째 필드가 전혀 필요하지 않습니다. 유효한 침대 파일은 다음과 같습니다.

chrIII  834297  835206

마지막으로, 귀하의 접근 방식은거의꼭 필요한 것보다 조금 더 복잡하지만. 마지막 정수는 s/[0-9]-/\1\t/숫자 합계를 탭으로 대체했기 때문에 처음부터 제거했습니다 . -이것은 본질적으로 여러분의 명령과 동일하지만 이 문제를 설명하고 불필요한 g전역 연산자를 제거하기 위해 약간만 수정되었습니다.

$ echo chrIII:834297-835206:-.miRanda.txt | 
    sed 's/\.miRanda.txt//' | 
        sed -E 's/:/\t/g; s/([0-9])-/\1\t/'
chrIII  834297  835206  -

왜 이것이 실패했다고 말하는지 모르겠습니다.

관련 정보