텍스트 파일에서 특정 ID를 구문 분석하는 방법은 무엇입니까?

텍스트 파일에서 특정 ID를 구문 분석하는 방법은 무엇입니까?

긴 텍스트 파일이 있습니다. 아래에는 파일 내용의 일부가 표시되어 있습니다.

[{"site":"1a2v_1","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_2","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_3","pfam":"Cu_amine_oxid","uniprot":"T12807"},{"site":"1a2v_4","pfam":"Cu_amine_oxid","uniprot":"P12808"},{"site":"1a2v_5","pfam":"Cu_amine_oxid","uniprot":"Z12809"},{"site":"1a2v_6","pfam":"Cu_amine_oxid","uniprot":"P12821"},{"site":"1a3z_1","pfam":"Copper-bind,SoxE","uniprot":"P0C918"},

위 텍스트 파일에서 ID를 구문 분석해야 하며 uniprot예상 결과는 아래와 같습니다.

P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

동일한 작업을 수행하기 위해 다음 명령을 시도했지만 아무것도 작동하지 않습니다.

sed -e 's/"uniprot":"\(.*\)"},{"site":"/\1/' file.txt
cat file.txt | sed 's/.*"uniprot":" //' | sed 's/"site":".*$//'

위에서 언급한 대로 ID를 구문 분석하는 데 도움을 주세요.

미리 감사드립니다.

답변1

Linux 시스템을 사용하는 경우 다음을 매우 쉽게 수행할 수 있습니다.

$ grep -oP '"uniprot":"\K[^"]+' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

이는 각 줄의 일치하는 부분만 인쇄하도록 -o지시 하고 Perl 호환 정규식을 활성화합니다. 정규식은 검색 한 다음 이를 버립니다( 즉, "지금까지 일치하는 항목을 모두 삭제"하여 출력에 포함되지 않음을 의미함). 그런 다음 ( ) 이 아닌 가장 긴 부분을 찾으십시오 .grep-P"uniprot":"\K"[^"]+


물론 이것은 JSON 데이터처럼 보이므로 더 복잡한 경우에는 jq. 클로징을 추가하여 파일을 수정 ]하고 다음과 같이 만들면:

[{"site":"1a2v_1","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_2","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_3","pfam":"Cu_amine_oxid","uniprot":"T12807"},{"site":"1a2v_4","pfam":"Cu_amine_oxid","uniprot":"P12808"},{"site":"1a2v_5","pfam":"Cu_amine_oxid","uniprot":"Z12809"},{"site":"1a2v_6","pfam":"Cu_amine_oxid","uniprot":"P12821"},{"site":"1a3z_1","pfam":"Copper-bind,SoxE","uniprot":"P0C918"}]

넌 할 수있어:

$ jq -r '.[].uniprot' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

답변2

주의 깊게 보면 입력 파일은 Python 데이터 구조입니다. 특히 사전 목록입니다. 닫는 대괄호를 추가해야 합니다.

ast 모듈을 사용하면 유효한 Python 데이터 구조인 문자열을 직렬화할 수 있습니다.

python3 -c 'import sys, ast
ifile,key = sys.argv[1:]
str = ""
with open(ifile) as fh:
  for l in fh: str += l.rstrip()
  lod = ast.literal_eval(str)
  for d in lod: print(d[key])
' file uniprot

P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

답변3

사용 gawk:

awk 'BEGIN{RS=","}
/uniprot/{print gensub(/.*("uniprot":")(.*)".*/, "\\2", "g") }' input

이 명령에서는 입력 레코드 구분 기호( RS)가 쉼표로 설정되어 있습니다.

그런 다음 gawk내장 함수는 gensub()역참조( )를 사용하여 원하는 패턴으로 라인을 대체합니다 \\2.

답변4

펄 5 솔루션

$ perl -nle 'print join"\n",m/uniprot\":\"(.*?)\"/g' file.txt
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
$

관련 정보