그래서 파일의 두 번째와 세 번째 열에 다음과 같이 텍스트를 설정했습니다.
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 's/\^[^`]*//g' input.txt
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
설명하다
sed
캐럿(^)으로 시작하고 단일 백틱을 제외한 모든 항목을 포함할 수 있는 하위 문자열을 제거하는 데 사용됩니다. 백틱이 발견되면 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.txt
2 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는 기본적으로 비어 있습니다.