편집: 블록 인용 텍스트를 추가했습니다.
acc.paired.txt
조명 샘플 이름( )이 포함된 탭으로 구분된 텍스트 파일( )이 있습니다 head
.
SRR10598163_R1.fastq.gz SRR8916417_R2.fastq.gz
SRR10598049_R1.fastq.gz SRR10598163_R2.fastq.gz SRR8916418_R1.fastq.gz
SRR10598049_R2.fastq.gz SRR10598164_R1.fastq.gz SRR8916418_R2.fastq.gz
SRR10598050_R1.fastq.gz SRR10598164_R2.fastq.gz SRR8916419_R1.fastq.gz
SRR10598050_R2.fastq.gz SRR10598165_R1.fastq.gz SRR8916419_R2.fastq.gz
SRR10598051_R1.fastq.gz SRR10598165_R2.fastq.gz SRR8916420_R1.fastq.gz
SRR10598051_R2.fastq.gz SRR10598166_R1.fastq.gz SRR8916420_R2.fastq.gz
SRR10598052_R1.fastq.gz SRR10598166_R2.fastq.gz SRR8916421_R1.fastq.gz
SRR10598052_R2.fastq.gz SRR10598167_R1.fastq.gz SRR8916421_R2.fastq.gz
SRR10598053_R1.fastq.gz SRR10598167_R2.fastq.gz SRR8916422_R1.fastq.gz
SRR10598053_R2.fastq.gz SRR10598168_R1.fastq.gz SRR8916422_R2.fastq.gz
SRR10598054_R1.fastq.gz SRR10598168_R2.fastq.gz SRR8916423_R1.fastq.gz
제가 만들고 싶은 변경 사항은 두 가지입니다. 1) 중복된 샘플 이름을 제거하고, 2) 특정 샘플 이름 뒤의 모든 문자를 제거합니다. 내 대상 출력은 SRR###
숫자( no _R#.fastq.qz
) 만 포함하고 중복 항목은 포함하지 않는 탭으로 구분된 텍스트 파일입니다 . 대상 출력 예:
SRR10598163
SRR8916417
SRR10598049
SRR8916418
SRR10598164
SRR10598050
SRR8916419
SRR10598165
SRR10598051
SRR8916420
SRR10598166
SRR10598052
SRR8916421
SRR10598167
SRR10598053
SRR8916422
SRR10598054
SRR10598168
SRR8916423
sed
문자 삭제 모드 로 전환합니다 .
`sed 's| _R1.fastq.gz||g' acc.paired.txt > out.txt`
그러나 out.txt
변화는 없습니다.
티아.
답변1
사용 grep
및 sort
:
grep -oE '\bSR[^_]+' file | sort -u
SRR10598049
SRR10598050
SRR10598051
[...]
정규식 일치는 다음과 같습니다.
마디 | 설명하다 |
---|---|
\b |
단어 문자(\w)와 단어가 아닌 문자 앵커 사이의 경계 앵커 |
SR |
'SR' |
[^_]+ |
다음을 제외한 모든 문자: _ (1회 이상(최대한 많이 일치)) |
답변2
GNU awk를 사용하여 및에 대한 다중 문자 RS
더하기 및 약어를 나타냅니다.\s
\S
[[:space:]]
[^[:space:]]
$ awk -v RS='_\\S+\\s*' '!seen[$0]++' file
SRR10598163
SRR8916417
SRR10598049
SRR8916418
SRR10598164
SRR10598050
SRR8916419
SRR10598165
SRR10598051
SRR8916420
SRR10598166
SRR10598052
SRR8916421
SRR10598167
SRR10598053
SRR8916422
SRR10598168
SRR10598054
SRR8916423
답변3
암소 비슷한 일종의 영양sed명령은 다음과 같습니다:
sed 's/\s/\n/g;s/_R[0-9].fastq.gz//g' acc.paired.txt | sort |uniq > out.txt
당신은 또한 이것을 할 수 있습니다앗:
awk '{gsub("_R[0-9].fastq.gz","\n", $0)gsub("\n ","\n",$0);gsub("\n$","",$0);print}' acc.paired.txt | sort | uniq > out.txt
두 번째 및 세 번째 gsub 함수는 공백과 마지막 개행 문자를 제거하는 데 사용됩니다.
답변4
당신은 할 수
- 모든 공백을 줄 바꿈으로 변경
tr
- 일치하는 모든
_R1.fastq.gz
콘텐츠 삭제sed
- 빈 줄 삭제
grep
- 그리고 출력을 정렬하여 중복 항목을 제거합니다
sort
.
% < acc.paired.txt tr ' ' '\n' | sed -e 's/_R.\.fastq\.gz//' | grep . | sort -u
SRR10598049
SRR10598050
SRR10598051
SRR10598052
[...]
주문을 제외하고 출력은 질문에 표시된 것과 동일합니다.
물론 정규식에서는 .
모든 문자가 일치하며 \.
. 이 있는 리터럴 점 grep .
은 최소한 하나의 문자를 포함하는 줄만 유지하므로 tr
연속된 공백으로 만들어진 빈 줄은 손실됩니다. 이것은 또한 주변 이 아닌 거기에 R1
도달하기 위해 , 만 가정합니다 .R9
R11