열에서 문자 뒤의 텍스트를 여러 번 삭제합니다.

열에서 문자 뒤의 텍스트를 여러 번 삭제합니다.

그래서 파일의 두 번째와 세 번째 열에 다음과 같이 텍스트를 설정했습니다.

GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`  

모든 기능 관련 텍스트를 제거하고 다음과 같은 출력을 얻고 싶습니다.

GO:0005634`GO:0003677

이 문제를 해결하기 위해 sed 또는 awk를 사용하는 방법을 모르겠습니다.

노트: 줄의 개수가 다릅니다 GO:xxxxxxx.

답변1

데이터가 백틱을 레코드 구분 기호로 사용하고 곡절 문자를 필드 구분 기호로 사용하는 것처럼 보입니다.

printf 'GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`' |
awk -F '^' -v RS='`' -v ORS='`' '{ print $1 }'

이는 각 레코드의 첫 번째 필드(GO 용어)만 인쇄하고 백틱을 출력 레코드 구분 기호로 사용합니다.

산출:

GO:0005634`GO:0003677`

(후행 개행 없음)

답변2

나는 이것이 당신이 요청한 것이라고 믿습니다.노트: input.txt입력 파일입니다.

그냥 sed
$ sed 's/\^[^`]*//g' input.txt
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
설명하다

sed캐럿(^)으로 시작하고 단일 백틱을 제외한 모든 항목을 포함할 수 있는 하위 문자열을 제거하는 데 사용됩니다. 백틱이 발견되면 sed무엇이든 대체되어 효과적으로 제거됩니다. 지칠 때까지 이 패턴을 반복합니다. 이는 모든 문자열을 제거하는 효과가 있습니다 ^.....

grep + 붙여넣기 + sed
$ grep -o 'GO:[0-9]\+' input.txt | paste -d'`' - - | sed 's/$/`/'
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
설명하다

grep파일에서 모든 GO:XXXXX 문자열을 가져와 input.txt2 paste개의 열에 넣고 2개의 GO:XXXXX 문자열 사이에 확인 표시를 추가한 다음 마지막 sed에 확인 표시를 추가합니다.

인용하다

답변3

GNU Awk( gawk) 사용:

gawk 'BEGIN{FPAT="`?GO:[0-9]+"; OFS=""} {$1=$1} 1' file

전임자.

$ echo 'GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`' | 
  gawk 'BEGIN{FPAT="`?GO:[0-9]+"; OFS=""} {$1=$1} 1'
GO:0005634`GO:0003677

답변4

perl -lne 'print /((?:^|`)GO:\d+)/g' genes.file

설명하다:

  • 라인 모드에서 실행 perl하고 레코드를 표준 출력으로 명시적으로 인쇄합니다.-n
  • 정규식/((?:^|`)GO:\d+)/g현재 레코드에서 GO: 문자열은 오른쪽에 숫자가 있고 왼쪽에 BOL 또는 백틱이 있습니다. 그런 다음 /g 옵션을 사용하여 여러 번 캡처하고 print 명령에 제공한 다음 이를 stdout에 표시하며 OFS는 기본적으로 비어 있습니다.

관련 정보