폴더의 모든 파일을 찾아 바꾸는 특수 패턴

폴더의 모든 파일을 찾아 바꾸는 특수 패턴

다음 문자열을 포함하는 공통 생물정보학 형식(FASTA)의 일련의 파일이 있습니다: 1개의 특수 문자 "">", 샘플 이름인 텍스트(문자열은 길이가 다양하고 숫자나 문자를 포함할 수 있음) 및 추가 숫자 나는 Mac OSX에서 Bash를 사용하고 있습니다.

샘플 이름 뒤의 모든 숫자를 제거하는 특수 패턴을 사용하여 텍스트 문자열을 찾아 바꾸고 싶습니다(여기 샘플은 "Tsuc2"입니다).지금까지 제가 찾은 가장 좋은 방법은 TextEdit에서 "숫자" 특수 모드를 수동으로 사용하는 것입니다. 이것은 효과가 있지만 이상적으로는for 루프파일을 열고 찾기 및 바꾸기 작업을 하나씩 수행하는 대신 폴더에 있는 모든 파일을 찾습니다.나는 grep이나 sed를 사용할 것이라고 생각합니다. 내가 가진 문제는 추가 자릿수의 수가 다양하고 샘플 이름과 제거해야 하는 숫자 사이에 구분 기호가 없다는 것입니다.

내 추측으로는

$ for FILE in *_R2.fastq.gz.fa; do sed -i 's\[b$FILE]\[0-9]\b/$FILE/g'; done

이것은 작동하지 않습니다(아마도 명백한 이유 때문일 것입니다). 어떤 아이디어가 있나요?

의견을 해결하기 위해 편집: 예, 이것은 fasta 파일입니다(기본적으로 .txt와 동일하지만 형식이 항상 ">" + "샘플 이름" + "뉴클레오티드 서열"을 따른다는 점에서 고유합니다. 압축되지 않습니다. Base Call 점수가 아닌 잘린 시퀀스만 포함하는 압축된 fastq 파일입니다.

샘플 이름에 숫자("Tsuc2")가 포함되어 있기 때문에 질문을 "모든 행의 모든 ​​숫자 제거"로 재구성할 수 없습니다. 단일 파일에서 추가 숫자를 쉽게 제거할 수 있었습니다. 제 질문은 "유지할 문자 수와 숫자가 파일 간에 다르고 파일이 없는 경우 폴더에 있는 모든 파일에 대한 문자열을 찾고 바꾸는 방법"입니다. 샘플 이름 파이프 표면에 추가된 숫자와 숫자 사이의 구분 기호입니다. "

여기 텍스트 편집기는 ">"를 들여쓰기로 해석하기 때문에 파일 레이아웃을 이미지로 제공했지만 아래 대괄호 안에 붙여넣을 수 있습니다.

>Tsuc21
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTAAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
>Tsuc22
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTCAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
GATTCCCAACACTAAGCTAGGCTTAAGGGT
>Tsuc23
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCTTGTAAAAATTACAGTGGTGTTTAACGGCCGAGAACCGCC
GAGTCTCCCAAGCGAGAAAGTAAACTACTACGCTCGGAGCCACGGAGGGCCCTCCACTGATCTTGGGGGCCTGCGAGAGT
TTTTAATTAACGCTCGCAGAGGGCCCCAAC
>Tsuc24
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTCAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
GATTCCCAACACTAAGCTAGGCTTAAGGGT

여러 줄의 데이터가 포함된 FASTA 파일의 이미지. 각 줄에는 추가 숫자(때로는 단일 숫자, 최대 수만 자리)가 무한히 추가됩니다.

답변1

실제 파일 이름을 보여주면 이를 조정할 수 있지만, 예제 이름이 항상 _파일 이름의 첫 번째 문자열 이전에 가장 긴 문자열이라고 가정하면 다음을 수행할 수 있습니다.

for file in *_R2.fastq.gz.fa; do
   sed -i '.bak' "s/\(>${file%%_*}\).*/\1/" "$file"
done

${file%%_*}보다 일반적으로 or 구문은 ${var%%pattern}"문자열 끝에서 가장 긴 패턴 발생을 제거"하는 데 사용되는 bash 문자열 작업입니다. 여기서 패턴은 _*첫 번째 _부터 문자열 끝까지 모든 것을 제거하고 샘플 이름은 남깁니다. 이렇게 -i '.bak'하면 sed수정된 모든 파일의 백업 복사본이 생성됩니다. 원하지 않으면 사용할 수 있지만 BSD (macOS에 있는 기능) 에서는 단독으로 사용할 -i ''수 없습니다 . 마지막으로 표현식은 유지하려는 부분을 캡처하여 유지하고 나머지는 제거합니다.-isedsed\1


증가하는 숫자(그 모양)만 제거하려는 경우 1첫 번째 Sequence ID 행, 2두 번째 Sequence ID 행 등에서 제거하려는 경우 다음과 같이 더 직접적으로 수행할 수 있습니다.

perl -i '.bak' -pe '$k++ if />/; s/(>.+?)$k.*/$1/' *_R2.fastq.gz.fa

비결은 a를 볼 때 $k마다 하나를 추가한 다음 a 값 이전의 값을 유지하고 나머지는 삭제한다는 것입니다.>$k

관련 정보