출력 파일을 변경하지 않고 sed를 사용하여 텍스트 파일에서 특정 문자열을 제거하시겠습니까?

출력 파일을 변경하지 않고 sed를 사용하여 텍스트 파일에서 특정 문자열을 제거하시겠습니까?

편집: 블록 인용 텍스트를 추가했습니다.

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

사용 grepsort:

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도달하기 위해 , 만 가정합니다 .R9R11

관련 정보