확장된 열 값을 기준으로 CSV 파일 필터링

확장된 열 값을 기준으로 CSV 파일 필터링

다음 CSV 파일이 있습니다.

ID,PDBID,FirstResidue,SecondResidue,ThirdResidue,FourthResidue,Pattern
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_3,4tov,1043,1044,1047,1048,CC/GA Naked ribose-zipper
RZ_AUTO_4,4tov,1556,1557,1514,1515,CC/GA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_6,4tow,766,767,1524,1525,AA/CG Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

각 행을 반복하면서 FirstResidue 및 SecondResidue 값을 확장할 수 있는 행을 인쇄해야 합니다(즉, SecondResidue는 동일한 PDBID를 사용하는 다른 행에서 FirstResidue가 됩니다). 예를 들어 (RZ_AUTO_1 행 및 RZ_AUTO_2 행) AND (RZ_AUTO_5 행 및 RZ_AUTO_7 행)입니다. 출력은 다음과 같아야 합니다.

RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

awk나 다른 UNIX 방법을 사용하여 이를 수행할 수 있습니까? 저는 OSX를 사용하고 있습니다.

답변1

다음을 시도해 볼 수 있습니다.

$ sort -rt"," -k2,3 file.csv | 
   awk -F, '{a[$2][$3]=$0; if(a[$2][$4]){print a[$2][$4]; print;}}'
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper

설명하다

  • sort파일은 두 번째 및 세 번째 필드를 기준으로 정렬되어 동일한 PDBID를 가진 행이 함께 정렬되고 함수의 첫 번째 나머지 위치를 기준으로 정렬됩니다 . -r정렬을 반대로 하려면(더 큰 숫자가 먼저 인쇄되도록) -t,필드 구분 기호를 로 설정하고 ,정렬 -k할 필드를 정의합니다.

awk스크립트 는 다음과 같습니다 .

  • -F,: 필드 구분 기호를 로 설정합니다 ,.
  • a[$2][$3]=$0;: 리스트의 리스트, 2차원 배열입니다. 예를 들어 첫 번째 행의 경우 배열 이름만 됩니다 a[4tov][1404]=$0. a값은 현재 행으로 설정됩니다 $0.
  • if(a[$2][$4]): 네 번째 필드(두 번째 잔여물)가 첫 번째 잔여물과 동일한 PDBID를 갖는 것으로 확인된 경우.
  • print a[$2][$4]; print;: 현재 행(배열의 값으로 저장되므로 a)과 현재 행을 인쇄합니다.

확인하기 위해 OSX에 액세스할 수는 없지만귀하의 의견awk, Python과 달리 OSX는 GNU awk다차원 배열을 처리할 수 없는 것 같습니다 . 따라서 Perl에서도 동일한 일이 발생합니다.

sort -rt"," -k2,3 file.csv | 
 perl -F"," -ane '$k{$F[1]}{$F[2]}=$_; 
                  print "$k{$F[1]}{$F[3]}$_" if $k{$F[1]}{$F[3]}'

답변2

당신은 그것을 사용할 수 있습니다텍스트 쿼리SQL 데이터베이스와 같은 스프레드시트 데이터를 쿼리합니다.

답변3

python3을 통해 모듈을 사용하세요 re.

#!/usr/bin/python3
import re
import sys
j = sys.argv[1]
with open(j) as f:
    fil = f.read()
m = re.findall(r'(?s)(?:^|\n)([^,]*,([^,]*),[^,]*,([^,]*)[^\n]*).*?\n([^,]*,\2,\3,[^\n]*)', fil)
for i in m:
    print(i[0]+'\n'+i[-1])

위의 코드를 이라는 이름의 파일에 저장 script.py하고 터미널에서 다음 명령을 실행하여 파일을 실행합니다.

python3 script.py inputfile

정규식 데모

$ python3 script.py file.csv
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

관련 정보